close

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(...)
由于此两处都涉及到变量pass,所以为了防止Race Condition,必须得加锁。所以代码会变成下面这样:
// 条件测试
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的,



作者:
arrow
arrow
    文章標籤
    pthread_cond_wait()的使用方法:
    全站熱搜
    創作者介紹
    創作者 丘猴子 的頭像
    丘猴子

    轉貼部落格

    丘猴子 發表在 痞客邦 留言(0) 人氣()