網路程式設計 互斥量和鎖

2021-10-06 06:02:36 字數 2338 閱讀 9428

一、互斥量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的互斥量和自旋鎖

一 自旋鎖與互斥量的區別 在多處理器環境中,自旋鎖最多只能被乙個可執行執行緒持有。如果乙個可執行執行緒試圖獲得乙個被爭用 已經被持有的 自旋鎖,那麼該執行緒就會一直進行忙等待,自旋,也就是空轉,等待鎖重新可用。如果鎖未被爭用,請求鎖的執行執行緒便立刻得到它,繼續執行。乙個被爭用的自旋鎖使得請求它的執...