2011-10-14 24 views
8

說你有這樣的代碼爲什麼你需要一個while循環,同時等待條件變量

pthread_mutex_lock(&cam->video_lock); 
while(cam->status == WAIT_DISPLAY) // <-- Why is this a 'while' and not an 'if'? 
    pthread_cond_wait(&cam->video_cond, &cam->video_lock); 
pthread_mutex_unlock(&cam->video_lock); 

我的問題是,你爲什麼在這裏需要一個while循環。不會pthread_cond_wait只是等到信號線程信號cam_video_cond?好吧,我知道你可能有當調用pthread_cond_wait被稱爲其中凸輪>狀態不等於WAIT_DISPAY的情況下,但在這種情況下,你可以只檢查它通過如果條件,而不是使用

我在這裏錯過了什麼嗎?我對pthread_cond_wait的理解是它只是等待無限,如果cam_video_cond沒有發信號。此外,它在被調用時解鎖互斥鎖,但當條件被髮信號時,在返回之前,它會重新鎖定cam_video_lock。我對嗎?

+0

同樣的問題在這裏http://www.unix.com/programming/149791-condition-variables。html – MetallicPriest

+0

[虛假喚醒](http://en.wikipedia.org/wiki/Spurious_wakeup) –

回答

17

建議所有線程檢查從調用pthread_cond_wait返回 後的情況,因爲有幾個原因的情況 可能不是真的。其中一個原因是虛假喚醒;即 線程可能會被喚醒,即使沒有線程表示 條件。

來源:Spurious wakeup

2

由於性能方面的原因,POSIX API允許操作系統喚醒您的線程,即使條件未滿足(稱爲spurious wakeup)。

9

雜散喚醒是一個原因,但合法的,但外來的喚醒是另一回事。

考慮:

  1. 你把作業上的隊列。

  2. 你發出信號的條件變量,喚醒線程A

  3. 你把作業上的隊列。

  4. 你發出信號的條件變量,甦醒線程B.

  5. 線程A被預定,做的第一件工作。

  6. 線程A發現隊列非空並執行第二個任務。

  7. 線程B獲得調度,已被喚醒,但發現隊列仍爲空。

相關問題