複数のスレッドで待機条件とシグナル条件を実装しているときに問題が発生しました。
スレッドはミューテックスをロックし、他のスレッドがシグナルを送るまで条件変数を待機する必要があります。その間、別のスレッドが同じミューテックスをロックし、同じ条件変数を待機します。現在、プロセス全体で同時に実行されているスレッドは条件変数を通知しますが、待機している最初のスレッドのみを通知し、他のスレッドは通知しないようにしたいと考えています。
複数のスレッドで待機条件とシグナル条件を実装しているときに問題が発生しました。
スレッドはミューテックスをロックし、他のスレッドがシグナルを送るまで条件変数を待機する必要があります。その間、別のスレッドが同じミューテックスをロックし、同じ条件変数を待機します。現在、プロセス全体で同時に実行されているスレッドは条件変数を通知しますが、待機している最初のスレッドのみを通知し、他のスレッドは通知しないようにしたいと考えています。
2 つのスレッドが同じ条件変数を待機する場合、同じ条件を処理できるように準備するか、条件変数を同時に待機しないようにプログラムを慎重に作成する必要があります。
この通知を 2 番目のスレッドではなく最初のスレッドで処理する必要があるのはなぜですか?
2 つの個別の条件変数を使用したほうがよい場合があります。
pthread_cond_signal()
スレッドの 1 つをウェイクアップするために使用します。
ただし、複数の人が目覚める可能性があります。これは偽のウェイクアップと呼ばれます。上記のリンクのマニュアル ページで説明されているように、アプリケーションの状態を追跡するには変数が必要です。
あなたの要求は不可能です。「...待機している最初のスレッドだけにシグナルを送信し、他のスレッドにはシグナルを送信しないようにしたい」とあなたは言います。しかし、条件変数は、スレッドがシグナル状態にならないようにする方法を提供することは決してありません。したがって、スレッドにシグナルを送信してはならないという要件がある場合は、条件変数を使用できません。
次のような条件変数を常に使用する必要があります。
while(NotSupposedToRun)
pthread_cond_wait(...);
そのため、想定されていないときにスレッドが起動した場合、スレッドwhile
は静止false
し、スレッドはスリープ状態に戻ります。POSIX はスレッドが起動されないという保証を提供しないため、これは必須です。実装は完全に自由にpthread_cond_signal
呼び出しとして実装でき、pthread_cond_broadcast
必要に応じてすべてのシグナルですべてのスレッドのブロックを解除できます。
条件変数はステートレスであるため、実装では、スレッドが確実に起動されるかどうかがわかりません。pthread_cond_wait
スレッドが実行されるべきではない場合にのみ、常に呼び出すのはあなたの仕事です。
詳細については 、 http://en.wikipedia.org/wiki/Spurious_wakeup を参照してください。
while
上記のようなループ内の各スレッドのウェイクアップ条件を正確に指定できない場合は、条件変数を使用しないでください。