pthread_cond_wait()的使用方法:
pthread_mutex_lock(&qlock); //lock mutex
pthread_cond_wait(&qready, &qlock); //automatic unlock and wait for cond ; this is atomic operation
pthread_cond_wait return // check cond ok , then automatic lock mutex ; this is atomic operation
pthread_mutex_unlock(&qlock); //unlock for next
-----------------------------------
e.g
thread 1 :
pthread_mutex_lock(&mutex);1 ; 15(被 13卡住)
while (!空空如也)2
{
pthread_cond_wait(&cond, &mutex); 4(掛起,且unlock mutex 兩個動作是atomic) ; 9 (wait到8了,該function return 同時 lock mutex , 這兩動為atomic)
}
subsub();11 ; 17 (不做cond wait , 因為下面14已經++, something 為真)
pthread_mutex_unlock(&mutex); 12 ; 18
---------------------------
thread2:
pthread_mutex_lock(&mutex); 3(被上面1卡住) ; 5 (因為4解鎖,然後再lock 進到 6 ) ; 10 (被上面9卡住) ; 13 (12解鎖,且拿鎖才走到)
addadd(); 6 ; 14
pthread_mutex_unlock(&mutex); 7 ; 16
pthread_cond_signal(&cond) 8
********************************************************
- wait()操作通常伴随着条件检测,如:
while(pass == 0) pthread_cond_wait(...);
- signal*()函数通常伴随着条件改变,如:
pass = 1; pthread_cond_signal(...)
// 条件测试
pthread_mutex_lock(mtx);
while(pass == 0)
pthread_cond_wait(...);
pthread_mutex_unlock(mtx);
// 条件发生修改,对应的signal代码
pthread_mutex_lock(mtx);
pass = 1;
pthread_mutex_unlock(mtx);
pthread_cond_signal(...);
***********************************************
所以我的结论是:传递的mutex并不是为了防止wait()函数内部的Race Condition!而是因为调用wait()之前你总是获得了某个mutex(例如用于解决此处pass变量的Race Condition的mutex),并且这个mutex在你调用wait()的同時會自動释放掉
************************
Mutex一般有兩種使用情況,一種是單獨使用,保護臨界區。
一種是和condition配合使用,可以等待某condition拿到之後再向下走。
Condition 有兩種signal形式, single和 broadcast,下面例子是signal的,
作者: