條件變數是執行緒同步的另一種同步機制。執行緒在改變條件狀態前必須首先鎖住互斥量,其他執行緒在獲得互斥量之前不會察覺到這種改變,因為必須鎖定互斥量以後才能計算條件。
條件變數使用之前必須首先進行初始化,pthread_cond_t資料型別代表的條件變數可以用兩種方式進行初始化。對於靜態分配的條件變數可以將常量pthread_cond_initializer賦給條件變數。對於動態分配的條件變數可以使用pthread_cond_init函式對條件變數進行初始化。
在釋放底層的記憶體空間之前,可以使用pthread_mutex_destoy函式去初始化。
#include
int pthread_cond_init(pthread_cond_t *restrict cond,
pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t *cond);
使用pthread_cond_wait函式等待條件為真,如果在給定的時間內不為真的話,生成乙個出錯碼的返回變數。
#inc
lude
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
int pthread_cond_timewait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict timeout);
pthread_cond_wait總和乙個互斥鎖結合使用。在呼叫pthread_cond_wait前要先獲取鎖。
pthread_cond_wait函式執行時先自動釋放指定的鎖,然後等待條件變數的變化。在函式呼叫返回之前,自動將指定的互斥量重新鎖住。
#include
int pthread_cond_signal(pthread_cond_t * cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
pthread_cond_signal通過條件變數cond傳送訊息,若多個訊息在等待,它只喚醒乙個。
pthread_cond_broadcast可以喚醒所有。
呼叫pthread_cond_signal後要立刻釋放互斥鎖,因為pthread_cond_wait的最後一步是要將指定的互斥量重新鎖
住,如果pthread_cond_signal之後沒有釋放互斥鎖,pthread_cond_wait仍然要阻塞。
無論哪種等待方式,都必須和乙個互斥鎖配合,以防止多個執行緒同時請求pthread_cond_wait()(
或pthread_cond_timedwait(),下同)的競爭條件(race condition)。mutex互斥鎖必須是普通鎖
(pthread_mutex_timed_np)或者適應鎖 (pthread_mutex_adaptive_np),且在呼叫
pthread_cond_wait()前必須由本執行緒加鎖 (pthread_mutex_lock()),而在更新條件等待佇列以前,mutex保持鎖定
入pthread_cond_wait()前的加鎖動作對應。
Linux執行緒同步 4 條件變數
分類 應用程式設計 2007 08 22 19 39 3812人閱讀收藏 舉報條件變數分為兩部分 條件和變數.條件本身是由互斥量保護的.執行緒在改變條件狀態前先要鎖住互斥量.1.初始化 條件變數採用的資料型別是pthread cond t,在使用之前必須要進行初始化,這包括兩種方式 pthread....
linux執行緒同步 2 條件變數
一.概述 條件變數總是和互斥量一起使用,互斥量保護著條件變數,防止多個執行緒對條件變數產生競爭。等會寫個小例子,看它們如何一起合作!二.函式介面 1.初始化條件變數 1.1 巨集常量初始化 1 pthread cond t cond pthread cond initializer 1.2 函式初始...
執行緒同步(2)條件變數
互斥鎖有乙個明顯的缺點就是只有兩種狀態 鎖定和非鎖定,而條件變數通過允許執行緒阻塞和等待另個執行緒傳送訊號的方法來彌補互斥鎖的不足。條件變數通常和互斥鎖一起使用。條件變數的結構為pthread cond t 涉及函式 pthread cond init pthread cond detroy pth...