執行緒同步 條件變數 unix網路程式設計

2021-05-31 22:43:38 字數 2670 閱讀 8486

1.條件變數的概念 

條件變數是一種機制,它允許執行緒等待某些事件的發生。幾個執行緒可以等待同乙個條件變數直到其他執行緒啟用該條件變數為止,這類似於傳送乙個通知。這時,可以是乙個執行緒被喚醒以響應這個事件,也可以是所有等待條件變數的執行緒。

注意,條件變數本身並不提供「鎖」,因此互斥鎖常伴隨條件變數的使用,提供相應的鎖以安全地訪問條件變數。

2.條件變數的初始化和撤銷

在使用條件變數前,必須對其進行初始化。初始化條件變數可採用靜態或動態初始化方法。

對於靜態初始化方法,需要宣告乙個 pthread_cond_t  變數,並把它賦值為常數pthread_cond_initializer:

pthread_cond_t condition = pthread_cond_initializer; 

對於動態建立的條件變數,應當使用pthread_cond_init ()函式,其函式原型如下:

#include

int pthread_cond_init(pthread_cond_t *cond, 

const pthread_condattr_t *attr);

cond:指向乙個條件變數。

attr:乙個可選的pthread_condattr_t 指標。這個結構可用來設定各種條件變數屬性。但是通常並不需要這些屬性,所以通常做法是把它指定為  null。

返回值:成功時都返回0,否則返回錯誤碼。

一旦使用 pthread_cond_init  ()函式初始化了條件變數,當不用它時,就應使用pthread_cond_destroy ()撤銷它。pthread_cond_destroy ()函式的原型如下:

#include

int pthread_cond_destroy(pthread_cond_t *cond);

cond:指向乙個將被撤銷的條件變數。

返回值:成功時都返回0,否則返回錯誤碼。

pthread_cond_destroy ()函式釋放建立條件變數時分配給它的任何資源,但不會釋放用來儲存pthread_cond_t的記憶體。另外,如果還有執行緒等待該條件變數,不要撤銷它,否則會返回錯誤碼ebusy。 如果有多個執行緒等待同乙個條件變數,喚醒執行緒的次序由系統的排程策略決定。同時,被喚醒的執行緒將擁有其呼叫pthread_cond_wait()或pthread_cond_timedwait()函式時所使用的

互斥鎖。如果多個執行緒被喚醒,誰擁有互斥鎖由系統的排程策略決定。

3.傳送訊號和廣播

如果執行緒更改某些共享資料後,要喚醒所有正在等待的執行緒,則應呼叫

pthread_cond_broadcast()函式。該函式原型如下:

#include

int pthread_cond_broadcast(pthread_cond_t *cond);

cond:指向乙個將被啟用的條件變數。

返回值:成功時都返回0,否則返回錯誤碼。

在某些情況下,活動執行緒只需要喚醒乙個正在睡眠的執行緒。假設只對佇列新增了乙個工作作業,那麼只需要喚醒其中乙個執行緒。pthread_cond_signal()函式就只喚醒乙個執行緒。

其函式原型如下:

#include

int pthread_cond_signal(pthread_cond_t *cond);

cond:指向乙個將被啟用的條件變數。

返回值:成功時都返回0,否則返回錯誤碼。

pthread_cond_signal()和pthread_cond_broadcast()函式可以由任乙個執行緒呼叫,而不管其是否擁有相應的互斥鎖。

注意:條件變數應是已被初始化的,否則呼叫 pthread_cond_signal()或 pthread  _cond _broadcast()函式會返回錯誤碼einal。

4.等待條件變數

一旦初始化了互斥鎖和條件變數,就可以等待某個條件。pthread_cond_wait()和pthread_cond_timedwait()函式實現等待條件變數的功能。它們對擁有的互斥鎖進行解鎖,然後掛起執行緒直至該條件變數被啟用。當執行緒被喚醒後,它們對互斥鎖進行加鎖並返回。

pthread_cond_wait()函式原型如下:

#include

int pthread_cond_wait(pthread_cond_t *cond,  pthread_mutex_t  *mutex);

cond:指向條件變數。

mutex:指向互斥鎖。

返回值:成功時返回0,否則返回錯誤碼。 

與 pthread_cond_wait()函式不同,pthread_cont_timedwait()函式指定乙個等待的時間,如果超時,即使等待的條件變數還未被啟用,它也將返回。其函式原形如下:

#include

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,

const struct timespec *abstime);

cond:指向條件變數。

mutex:指向互斥鎖。

abstime:指向乙個絕對時間。

注意:乙個互斥鎖可以用於許多條件變數,但每個條件變數只能有乙個互斥鎖。呼叫pthread_cond_wait( )和pthread_cond_timedwait( )函式之前應把互斥鎖鎖定。

我覺得還是最好,乙個條件變數對應一把鎖吧。。。這樣一一對應吧

執行緒同步 條件變數

當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...

執行緒同步 條件變數

1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...

執行緒同步 條件變數

多執行緒中條件變數的使用 執行緒同步之條件變數 include include include include include include include include using namespace std 乙個簡單的緩衝區類 struct buffer bool full return f...