mutex從本質上說就是一把鎖,在應用層提供對共享資源的保護訪問。
(1)初始化
在linux下,執行緒的互斥量資料型別是pthread_mutex_t。在使用前,要對它進行初始化。通過pthread_mutex_init進行初始化,並且在釋放記憶體(free)前需要呼叫pthread_mutex_destroy.
原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restric attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
返回值:成功則返回0,出錯則返回錯誤編號。
(2)互斥操作
對共享資源的訪問,要對互斥量進行加鎖,如果互斥量已經上了鎖,呼叫執行緒會阻塞,直到互斥量被解鎖。在完成了對共享資源的訪問後,要對互斥量進行解鎖。
首先說一下加鎖函式:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
返回值: 成功則返回0, 出錯則返回錯誤編號。說明:具體說一下trylock函式,這個函式是非阻塞呼叫模式,也就是說,如果互斥量沒被鎖住,trylock函式將把互斥量加鎖,並獲得對共享資源的訪問許可權;如果互斥量被鎖住了,trylock函式將不會阻塞等待而直接返回ebusy,表示共享資源處於忙狀態。
再說一下解鎖函式:
原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);
返回值: 成功則返回0, 出錯則返回錯誤編號。
(3)例項
如果對乙個mutex變數testlock,執行了第一次pthread_mutex_lock(testlock)之後,在unlock(testlock)之前的這段時間內,如果有其他執行緒也執行到了pthread_mutex_lock(testlock),這個執行緒就會阻塞住,直到之前的執行緒unlock之後才能執行,由此,實現同步,也就達到保護臨界區資源的目的。
#include #include #include #include void *fun1(void *arg);
void *fun2(void *arg);
int buffer = 0;
pthread_mutex_t mutex;
int running = 1;
int main(void )
void *fun1(void *arg)
}void *fun2(void *arg)
}遮蔽互斥鎖的執行結果
加上互斥鎖的執行結果
互斥鎖程式解析
include include include include pthread mutex t mutex 互斥鎖 int lock var 全域性變數 void pthread1 void arg void pthread2 void arg int main 從上可以看出互斥鎖使用流程為 pth...
互斥鎖mutex簡單應用
寫了段小 學習互斥鎖的作用。互斥鎖的作用 在程式設計中,引入了物件互斥鎖的概念,來保證共享資料操作的完整性。思路是用2個執行緒對同乙個記憶體位置buffer,進行寫和讀,為了防止2個執行緒同時對buffer進行修改,用同一把互斥鎖來限制。寫操作簡化為把buffer修改為 w 讀簡化為把buffer修...
linux執行緒互斥鎖
使用執行緒編寫程式需要技巧,而多執行緒的程式中的bug非常難以跟蹤 除錯,因為這些bug經常是難以再現的。競爭條件 當乙個執行緒訪問乙個資料結構的時候,另乙個執行緒也訪問同乙個資料結構,這時就出現了競爭條件 兩個執行緒 也可能是多個 競爭對同乙個資源的訪問。當其中乙個執行緒處理到一部分的時候,另外的...