私の C++ プログラムには、pthreads (Linux 上で実行) に基づくトリガーと待機メンバー関数を持つクラス CEvent があります。待機中のプロセスが 1 つある場合、実装は非常に明白です (つまり、オンラインで多くの例を参照)。ただし、複数のスレッドがイベントを待機しており、trigger() が呼び出されたときにすべて確実にウェイクアップする必要があるという要件を満たす必要があります。2 つ目の条件として、trigger() が呼び出されたときに待機していたスレッドのみが起動する必要があります。
私の現在のコード:
void CEvent::trigger() {
pthread_mutex_lock(&mutex);
wakeUp = true;
pthread_cond_broadcast(&condition)
pthread_mutex_unlock(&mutex);
wakeUp = false;
}
void CEvent::wait() {
pthread_mutex_lock(&mutex);
while (!wakeUp)
pthread_cond_wait(&condition, &mutex)
pthread_mutex_unlock(&mutex);
}
これは、wakeUp を false に戻す前に待機中のすべてのスレッドがウェイクアップする限り、ほとんど機能しているようです。ただし、ブロードキャストと wakeUp のリセットの間に、wait() を呼び出す他の (または同じ) スレッドもすぐにウェイクアップしますが、これは受け入れられません。ミューテキストのロック解除の前に wakeUp = false を配置すると、スレッドが起動しなくなります。
私の質問: * pthread_cond_broadcast はいつ返されますか? つまり、すべてのスレッドが起動した後にのみ戻るという保証がありますか、それとも前に戻ることができますか? * この問題に対する推奨される解決策はありますか?