1. 程式人生 > >關於條件變量

關於條件變量

pid wait join cond col .com sign 測試 print

最近打算在寫一個網絡庫,涉及到對mutex、condition的封裝,再次使用Linux提供的接口,發現一個問題,使用condition的時候需要配合一個mutex來使用。

技術分享

上面是關於pthread_cond_wait的man手冊說明,意思就是再調用pthread_cond_wait之前需要把mutex上鎖,pthread_cond_wait會自動解鎖,然後等待條件變量被signal,執行線程會被掛起並不會消耗任何CPU時間,知道條件變量被signal。在返回到調用線程之前,pthread_cond_wait會重新獲取鎖(如果獲取不到鎖,會阻塞)。

我想要測試就是最後一點,如果在返回的時候獲取不到鎖,會不會阻塞,以及想知道為什麽需要與一個mutex配合使用。

測試代碼:

 1 /*
 2 * 測試pthread_cond_wait
 3 */
 4 #include <unistd.h>
 5 #include <pthread.h>
 6 
 7 #include <stdio.h>
 8 
 9 pthread_mutex_t mutex;
10 pthread_cond_t cond;
11 
12 void* mutex_func(void *arg)
13 {
14     // wait cond_func get the lock
15     printf("lock after 5s\n
"); 16 sleep(5); 17 pthread_mutex_lock(&mutex); 18 19 pthread_cond_signal(&cond); 20 21 printf("unlock after 5s\n"); 22 sleep(5); 23 pthread_mutex_unlock(&mutex); 24 } 25 26 void* cond_func(void *arg) 27 { 28 // lock 29 pthread_mutex_lock(&mutex);
30 31 pthread_cond_wait(&cond, &mutex); // unlock and block 32 printf("get signal\n"); 33 34 pthread_mutex_unlock(&mutex); 35 // acquire lock, will block 36 printf("cond_func\n"); 37 } 38 39 int main(void) 40 { 41 pthread_mutex_init(&mutex, NULL); 42 pthread_cond_init(&cond, NULL); 43 44 pthread_t pid1, pid2; 45 pthread_create(&pid1, NULL, mutex_func, NULL); 46 pthread_create(&pid2, NULL, cond_func, NULL); 47 48 pthread_join(pid1, NULL); 49 pthread_join(pid2, NULL); 50 51 return 0; 52 }

輸出結果:

技術分享

結論:

根據輸出結果可以知道,確實是它需要的mutex釋放之後才從pthread_cond_wait返回的。此處可以推測(需要看源碼驗證)pthread_cond_wait是去查看某一個條件是否為真來決定是否返回的(那麽就涉及到了race condition),所以需要使用mutex來保護。

源碼驗證:

關於條件變量