2011-10-14 20 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? OK、私はあなたがpthread_cond_waitのが呼び出されたときにCAM->は、ステータスWAIT_DISPAYと等しくない場合があるかもしれません知っているが、その場合にはあなただけではなくしばらく使用するよりもかの条件によってそれをチェックすることができます

ここに何か不足していますか? の私の理解pthread_cond_waitは、のcam_video_condが通知されない場合、無限に待機するということです。また、呼び出されたときcam_video_lock mutexのロックを解除しますが、条件が合図されたときに戻る前に、cam_video_lockを再ロックします。私は正しい?

+0

ここでも同じ質問、http://www.unix.com/programming/149791-condition-variables。html – MetallicPriest

+0

[偽の起床](http://ja.wikipedia.org/wiki/Spurious_wakeup) –

答えて

17

条件 が真ではないかもしれないいくつかの理由があるため、すべてのスレッドがpthread_cond_waitのから を戻した後の状態を確認することをお勧めします。これらの理由の1つは、偽の起床です。つまり、 スレッドが 状態を通知していなくても、スレッドがウェークアップする可能性があります。

出典:Spurious wakeup

2

パフォーマンス上の理由から、POSIX APIを使用すると、条件が満たされていなくても(つまり、spurious wakeupと呼ばれます)、OSがスレッドを起動できます。

9

スプリアスウェイクアップが一つの理由ですが、正当しかし余分なウェイクアップは別です。

は考えてみましょう:

  1. あなたがキューに仕事を置きます。

  2. は、あなたがキューに仕事を入れてスレッドA.

  3. を目覚め、条件変数を知らせます。

  4. あなたが

  5. スレッドAがスケジュールますスレッドBを目覚め、条件変数を通知、最初の仕事をしていません。

  6. スレッドAはキューを空ではなく、2番目のジョブを見つけます。

  7. スレッドBは、目覚めたがスケジュールされていますが、キューはまだ空です。