Linux-執行緒互斥-鎖
阿新 • • 發佈:2018-11-08
互斥鎖
當一個共享資源的操作不是原子的,在多執行緒同時訪問共享資源時可能會出現達不到預期的效果錯誤,為了解決共享資源操作競爭的問題,引入了互斥鎖。
1、訪問共享資源前,必須申請該互斥鎖,若處於開鎖狀態,則申請到鎖物件,並立即佔有該鎖,以防止其他執行緒訪問該資源;如果該互斥鎖處於鎖定狀態,則阻塞當前執行緒。
2、只有鎖定該互斥鎖的程序才能釋放該互斥鎖,其他執行緒試圖釋放無效。
init
pthread_mutex_t mutex_lock;
pthread_mutex_init(&mutex_lock,NULL);
lock
pthread_mutex_lock(&mutex_lock); 以阻塞方式申請互斥鎖;
pthread_mutex_trylock(&mutex_lock)以非阻塞方式申請互斥鎖;
unlock
pthread_mutex_unlock(&mutex_lock);
例項
2個執行緒分別對全域性變數count加加5000次,但由於操作count語句不是原子操作,會導致在最後給count記憶體賦值過程中被其他執行緒讀取導致出錯,這裡要想不出錯,2個辦法:
1、語句改為:count++;
2、加互斥鎖保護count資源;
#include<stdio.h> #include<pthread.h> #include<string.h> #include <sys/types.h> #include <unistd.h> int count = 0; pthread_mutex_t mutex_lock; void* pthread_run() { int i = 0; int ret = 0; while(i < 5000) { pthread_mutex_lock(&mutex_lock); i++; ret = count; printf("process ID:%d,pthread ID:%lu,count:%d\n",getpid(),pthread_self(),count); count = ret + 1; pthread_mutex_unlock(&mutex_lock); } pthread_exit(NULL); } int main() { pthread_t id1; pthread_t id2; pthread_mutex_init(&mutex_lock,NULL); pthread_create(&id1,NULL,&pthread_run,NULL); pthread_create(&id2,NULL,&pthread_run,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf("count: %d\n",count); return 0; }
核心執行緒鎖