一、互斥量mutex
多執行緒可以考慮同一時間只有乙個執行緒訪問資料。互斥量(mutex)就是一把鎖。
多個執行緒只有一把鎖乙個鑰匙,誰上的鎖就只有誰能開鎖。當乙個執行緒要訪問乙個共享變數時,先用鎖把變數鎖住,然後再操作,操作完了之後再釋放掉鎖,完成。
當另乙個執行緒也要訪問這個變數時,發現這個變數被鎖住了,無法訪問,它就會一直等待,直到鎖沒了,它再給這個變數上個鎖,然後使用,使用完了釋放鎖,以此進行。
這個即使有多個執行緒同時訪問這個變數,也好象是對這個變數的操作是順序進行的。
互斥變數使用特定的資料型別:pthread_mutex_t,使用互斥量前要先初始化,
pthread_mutex_t
pthread_mutex_t 型別,其本質是乙個結構體,為簡化理解,應用時可忽略其實現細節,簡單當成整數看待。
pthread_mutex_t mutex:變數mutex只有兩種取值0、1;
互斥量初始化:
a)、posix定義了乙個巨集pthread_mutex_initializer來靜態初始化互斥鎖,方法如下:
pthread_mutex_t mutex=pthread_mutex_initializer;
在linuxthreads實現中,pthread_mutex_t是乙個結構,而pthread_mutex_initializer則是乙個結構常量。
b)、動態方式是採用pthread_mutex_init()函式來初始化互斥鎖,api定義如下:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
其中mutexattr用於指定互斥鎖屬性(見下),如果為null則使用預設屬性。
加鎖與解鎖
lock與unlock:
lock嘗試加鎖,如果加鎖不成功,執行緒阻塞,阻塞到持有該互斥量的其他執行緒解鎖為止。
unlock主動解鎖,同時將阻塞到該鎖上所有執行緒全部喚醒,至於哪個執行緒先被喚醒取決於優先順序,排程。預設:先阻塞、先喚醒。
例如:t1 t2 t3 t4 使用一把mutex鎖,t1加鎖成功,其他執行緒均阻塞,直至t1解鎖,t1解鎖後,t2 t3 t4均被喚醒,並自動再次嘗試加鎖。
避免死鎖
產生死鎖的情況較多,如乙個執行緒對變數a加鎖後,試圖對變數b加鎖,另乙個執行緒對變數b加了鎖,試圖對a加鎖,這時兩個執行緒都不釋放鎖,加不會加鎖成功,造成兩個執行緒處於死鎖狀態。
可以在設計中避免死鎖的發生。如使用 pthread_mutex_timedlock函式,該函式允許執行緒阻塞特定時間,如果加鎖失敗就會返回etimedout。函式原型如下:
#include #include int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timesec *restrict tsptr);
鎖操作:
pthread_mutex_destroy ()登出乙個互斥鎖
加鎖 pthread_mutex_lock()、
解鎖pthread_mutex_unlock()
測試加鎖 pthread_mutex_trylock()三個
等待和激發:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)
激發條件有兩種形式,
pthread_cond_signal()啟用乙個等待該條件的執行緒,存在多個等待執行緒時按入隊順序啟用其中乙個;
而pthread_cond_broadcast()則啟用所有等待執行緒。
3、處理流程
pthread_cond_wait使用前必須由本執行緒呼叫pthread_mutex_lock加鎖
pthread_mutex_lock(&mtx);
pthread_cond_wait(&cond,&mtx);
pthread_mutex_unlock(&mtx);
pthread_cond_wait內部處理流程:解鎖—>阻塞休眠—>喚醒—>加鎖
相關鎖鏈結
訊號量和互斥鎖
概念 訊號量用在多執行緒多工 同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在sem wait的時候,就阻塞在那裡 互斥鎖是用在多執行緒多工 互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可...
訊號量和互斥量(鎖)的區別
訊號量 那是多執行緒同步用的,乙個執行緒完成了某乙個動作就通過訊號告訴別的執行緒,別的執行緒再進行某些動作。互斥量 這是多執行緒互斥用的,比如說,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,知道這個執行緒離開,其他的執行緒才開始可以利用這個資源。訊號量與普通整型變數的區別 訊號量 sema...
pthread的互斥量和自旋鎖
一 自旋鎖與互斥量的區別 在多處理器環境中,自旋鎖最多只能被乙個可執行執行緒持有。如果乙個可執行執行緒試圖獲得乙個被爭用 已經被持有的 自旋鎖,那麼該執行緒就會一直進行忙等待,自旋,也就是空轉,等待鎖重新可用。如果鎖未被爭用,請求鎖的執行執行緒便立刻得到它,繼續執行。乙個被爭用的自旋鎖使得請求它的執...