manページを引用するには:
条件変数を使用する場合、各条件に関連付けられた共有変数を含むブール述語が常にあり、スレッドが続行する場合はtrueになります。pthread_cond_timedwait()またはpthread_cond_wait()関数からの誤ったウェイクアップが発生する場合があります。pthread_cond_timedwait()またはpthread_cond_wait()からの戻りは、この述部の値について何の意味も持たないので、そのような戻り時に述部を再評価する必要があります。
そのため、pthread_cond_wait
通知していなくても戻ることができます。少なくとも一見すると、それはかなりひどいようです。これは、間違った値をランダムに返したり、実際に適切なreturnステートメントに到達する前にランダムに返したりする関数のようなものです。大きなバグのようです。しかし、これを修正するのではなくmanページに文書化することを選択したという事実は、pthread_cond_wait
誤って目を覚ますことになる正当な理由があることを示しているようです。おそらく、それがどうしようもないようにそれを作るそれがどのように機能するかについて本質的な何かがある。問題は何ですか。
なぜpthread_cond_wait
偽って戻るのですか?正しく通知された場合にのみウェイクアップすることを保証できないのはなぜですか?誰かがその偽の振る舞いの理由を説明できますか?
pthread_cond_(timed)wait
:「シグナルが配信された場合...中断されないか、または疑似ウェイクアップのためにゼロを返します。」他のブロッキング関数はEINTR
、信号によって中断されたとき(たとえばread
)、または再開する必要があるとき(たとえばpthread_mutex_lock
)を示します。したがって、偽のウェイクアップの理由が他にない場合はpthread_cond_wait
、それらのいずれかと同じように定義できます。