對於多執行緒程式設計的互斥鎖和條件變數以及訊號量的理解

2022-07-08 22:24:10 字數 1128 閱讀 3490

對於多執行緒程式設計,我們有時候會遇到多個執行緒需要互斥訪問同乙個資源的問題,或者是執行緒間同步的問題,比如生存者和消費者,下面我就來講講多執行緒程式設計中的同步和互斥的問題。

1:互斥鎖

當有乙個鍊錶,這個鍊錶需要兩個執行緒互斥訪問時,我們就需要互斥鎖。為什麼呢?因為當乙個執行緒要去使用這個鍊錶時,首先他得先獲得鎖,一旦發現鎖已經被別的執行緒占用,則無法獲得鎖將阻塞等待互斥鎖被別人解鎖,當然也有辦法不阻塞,一旦無法獲得鎖,則直接返回。

如何初始化鎖:

函式原型:

int pthread_mutex_init (pthread_mutex_t*mutex,constpthread_mutexattr_t* mutexattr);

函式傳入值:  mutex:互斥鎖。

互斥鎖有三種型別:

mutexattr:

pthread_mutex_initializer 建立快速互斥鎖。

pthread_recursive_mutex_initializer_np 建立遞迴互斥鎖。

pthread_errorcheck_mutex_initializer_np  建立檢錯互斥鎖。

區別如下:

互斥量分為下面三種:

1、快速型。這種型別也是預設的型別。該執行緒的行為正如上面所說的。

2、遞迴型。如果遇到我們上面所提到的死鎖情況,同一執行緒迴圈給互斥量上鎖,那麼系統將會知道該上鎖行為來自同一執行緒,那麼就會同意執行緒給該互斥量上鎖。

3、錯誤檢測型。如果該互斥量已經被上鎖,那麼後續的上鎖將會失敗而不會阻塞,pthread_mutex_lock()操作將會返回edeadlk。

使用方式如下:

pthread_mutex_t mutex;

pthread_mutex_init (&mutex, null); /*定義*/

...pthread_mutex_lock(&mutex); /*獲取互斥鎖*/

臨界資源

pthread_mutex_unlock(&mutex); /*釋放互斥鎖*/

此時對鎖的訪問時阻塞的。所以這就會出現這麼乙個問題,當同乙個執行緒已經獲得這個鎖,並且沒有釋放這個鎖,如果他在申請鎖,將造成死鎖。所以對於同乙個執行緒獲取了鎖,記得要釋放。不要因為其他原因導致釋放鎖沒有被執行,而再次去請求鎖。

2:條件變數

多執行緒程式設計 互斥鎖 條件變數

一,互斥鎖 在多工作業系統中,有很多任務同時執行,這些任務可能會用到同乙個資源,如果沒有一種機制來控制這些任務共享同乙個資源,那這些任務可能無法正常使用自己想用的資源。互斥鎖 是多工作業系統中一種簡單的加鎖方法,來控制各任務對共享資源的訪問。互斥鎖的狀態 上鎖 lock 和解鎖 unlock 互斥鎖...

多執行緒的互斥鎖和條件變數

執行緒間的互斥的同步一直是乙個很重要的地方,在這裡做個總結 所用的介面 int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg void pthread exit v...

多執行緒程式設計 互斥鎖

多執行緒程式設計 互斥鎖 1 引言 互斥鎖,是一種訊號量,常用來防止兩個程序或執行緒在同一時刻訪問相同的共享資源。可以保證以下三點 1 原子性 把乙個互斥量鎖定為乙個原子操作,這意味著作業系統 或pthread函式庫 保證了如果乙個執行緒鎖定了乙個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥...