続 条件変数
条件変数をwait()するスレッドがwhileループで何度も条件を判定しているのは不思議に思えるかもしれません。
wait()から復帰しても「条件」を満たしていないパターンとして、
- 自スレッドが期待している「条件」は満たしていないが、notify_one()/notify_all()が呼ばれた
- 一つの条件変数に対し、複数のスレッドがwait()していて、復帰した他のスレッドが「条件」を変更してしまった
- wait()中にスレッドがPOSIXシグナルを受信したため、pthread_cond_wait()が中断された
などが考えられます。
1と2はそのままなので、3に関して補足しておきます。
boost::conditionのPOSIX用実装では、wait()にpthread_cond_wait()を用いています。この関数は永久にブロックする可能性のあるものなので、POSIXシグナル(SIGALRMなど)を受信すると処理を中断します。
WindowsとMacの実装でwait()が中断されることがあるかどうかはきちんと追えていないのですが、少なくとも移植性が必要な場合にはこのパターンに注意する必要があります。