與條件變數相關api
條件變數是執行緒另一可用的同步機制。條件變數給多個執行緒提供了乙個會合的場所。條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待特定的條件發生。
條件本身是由互斥量保護的。執行緒在改變條件狀態前必須首先鎖住互斥量,其他執行緒在獲得互斥量之前不會察覺到這種改變,因為必須鎖定互斥量以後才能計算條件。
條件變數使用之前必須首先初始化,pthread_cond_t資料型別代表的條件變數可以用兩種方式進行初始化,可以把常量 pthread_cond_initializer賦給靜態分配的條件變數,但是如果條件變數是動態分配的,可以使用pthread_cond_destroy函式對條件變數進行去除初始化(deinitialize)。
1. 建立及銷毀條件變數
#include
intpthread_cond_init
(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr)
;int
pthread_cond_destroy
(pthread_cond_t*restrict cond)
;// 返回:若成功返回0,否則返回錯誤編號
除非需要建立乙個非預設屬性的條件變數,否則pthread_cont_init函式的attr引數可以設定為null。cond引數是條件也要進行定義和初始化
2. 等待
#include
intpthread_cond_wait
(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)
;//這個是立即返回
intpthread_cond_timedwait
(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, cond struct timespec *restrict timeout)
;//這個是等待一段時間後返回
// 返回:若成功返回0,否則返回錯誤編號
pthread_cond_wait等待條件變為真。如果在給定的時間內條件不能滿足,那麼會生成乙個代表乙個出錯碼的返回變數。傳遞給pthread_cond_wait的互斥量對條件進行保護,呼叫者把鎖住的互斥量傳給函式。函式把呼叫執行緒放到等待條件的執行緒列表上,然後對互斥量解鎖,這兩個操作都是原子操作。這樣就關閉了條件檢查和執行緒進入休眠狀態等待條件改變這兩個操作之間的時間通道,這樣執行緒就不會錯過條件的任何變化。pthread_cond_wait返回時,互斥量再次被鎖住。
pthread_cond_timedwait函式的工作方式與pthread_cond_wait函式類似,只是多了乙個timeout。timeout指定了等待的時間,它是通過timespec結構指定。
3. 觸發
#include
intpthread_cond_signal
(pthread_cond_t*restrict cond)
;int
pthread_cond_broadcast
(pthread_cond_t *restrict cond)
;// 返回:若成功返回0,否則返回錯誤編號
這兩個函式可以用於通知執行緒條件已經滿足。pthread_cond_signal函式將喚醒等待該條件的某個執行緒,而pthread_cond_broadcast函式將喚醒等待該條件的所有程序。
注意一定要在改變條件狀態以後再給執行緒發訊號。
**示例
#include
#include
#include
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
int g_data=0;
//pthread_mutex_t mutex;
pthread_cond_t cond;
void
*func1
(void
*arg)}}
void
*func2
(void
*arg)
pthread_mutex_unlock
(&mutex)
;sleep(1
);}pthread_mutex_unlock
(&mutex);}
intmain()
ret=
pthread_create
(&t2,
null
,func2,
(void*)
¶m);if
(ret==0)
// printf("main : %ld \n",(unsigned long)pthread_self());
pthread_join
(t1,
null);
pthread_join
(t2,
null);
pthread_mutex_destroy
(&mutex)
;pthread_cond_destroy
(&cond)
;return0;
}//其中func1中的cnt是測試用的
以下**可以用試:
clc@embed_learn:
~/xiancheng$ gcc demo8.c -lpthread -odemo8
clc@embed_learn:
~/xiancheng$ vi text1.c
clc@embed_learn:
~/xiancheng$ .
/a.out 10
>>test.ret.txt &(其中》表示將執行的結果追加到test.ret.txt中 &表示在後台執行)[1
]21313(這是程序的id號)
初始化
pthread_mutex_t mutex=pthread_mutex_initializer;
pthread_cond_t cond=pthread_cond_initializer;
//靜態初始化
pthread_mutex_init
(&mutex,
null);
pthread_cond_init
(&cond,
null);
//動態初始化
參考博文: 條件變數實現執行緒同步
1 什麼是條件變數實現執行緒同步?假如我們的程式中有兩個執行緒,乙個是生產者執行緒,另乙個是消費者執行緒,生產者執行緒每隔一段時間把資料寫入到緩衝區buffer中,而消費者執行緒則每隔一段時間從buffer中取出資料,為了避免兩個執行緒讀寫混亂,我們讓生產線執行緒寫完後再通知消費者來讀資料,那麼則可...
執行緒同步 條件變數
當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...
執行緒同步 條件變數
1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...