Linux執行緒同步 4 條件變數

2021-06-12 18:09:09 字數 1379 閱讀 4723

分類: 應用程式設計

2007-08-22 19:39

3812人閱讀收藏 

舉報條件變數分為兩部分: 條件和變數. 條件本身是由互斥量保護的. 執行緒在改變條件狀態前先要鎖住互斥量. 

1. 初始化:

條件變數採用的資料型別是pthread_cond_t, 在使用之前必須要進行初始化, 這包括兩種方式:

<

pthread.h

>

intpthread_cond_init(pthread_cond_t 

*restrict cond, pthread_condattr_t 

*restrict attr);

intpthread_cond_destroy(pthread_cond_t 

*cond);

成功則返回0, 出錯則返回錯誤編號.

當pthread_cond_init的attr引數為null時, 會建立乙個預設屬性的條件變數; 非預設情況以後討論.

2. 等待條件:

<

pthread.h

>

intpthread_cond_wait(pthread_cond_t 

*restrict cond, pthread_mutex_t 

*restric mutex);

intpthread_cond_timedwait(pthread_cond_t 

*restrict cond, pthread_mutex_t 

*restrict mutex, 

const

struct

timespec 

*restrict timeout);

成功則返回0, 出錯則返回錯誤編號.

這兩個函式分別是阻塞等待和超時等待.

等待條件函式等待條件變為真, 傳遞給pthread_cond_wait的互斥量對條件進行保護, 呼叫者把鎖住的互斥量傳遞給函式. 函式把呼叫執行緒放到等待條件的執行緒列表上, 然後對互斥量解鎖, 這兩個操作是原子的. 這樣便關閉了條件檢查和執行緒進入休眠狀態等待條件改變這兩個操作之間的時間通道, 這樣執行緒就不會錯過條件的任何變化.

當pthread_cond_wait返回時, 互斥量再次被鎖住.

3. 通知條件:

<

pthread.h

>

intpthread_cond_signal(pthread_cond_t 

*cond);

intpthread_cond_broadcast(pthread_cond_t 

*cond);

成功則返回0, 出錯則返回錯誤編號.

這兩個函式用於通知執行緒條件已經滿足. 呼叫這兩個函式, 也稱向執行緒或條件傳送訊號. 必須注意, 一定要在改變條件狀態以後再給執行緒傳送訊號.

Linux 執行緒同步3 條件變數

條件變數是執行緒同步的另一種同步機制。執行緒在改變條件狀態前必須首先鎖住互斥量,其他執行緒在獲得互斥量之前不會察覺到這種改變,因為必須鎖定互斥量以後才能計算條件。條件變數使用之前必須首先進行初始化,pthread cond t資料型別代表的條件變數可以用兩種方式進行初始化。對於靜態分配的條件變數可以...

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...