私のC++プログラムでは、pthreads(Linux上で実行中)に基づいて、トリガと待機メンバ関数を持つクラスCEventがあります。待機中のプロセスが1つある場合、実装は非常に明白です(つまり、オンラインの多くの例)。しかし今は、複数のスレッドがイベントを待っているという要件を満たす必要があり、trigger()が呼び出されたときにすべてが確実に起動するはずです。 2番目の条件として、trigger()が呼び出されたときに待機していたスレッドだけが目を覚ます必要があります。pthreadベースのイベントは、待機中のスレッドだけを呼び起こします
私の現在のコード:
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のブロードキャストとリセットの間にwait()を呼び出す他の(または同じ)スレッドもすぐに起き上がり、これは受け入れられません。 mutext unlockingの前にwakeUp = falseを設定すると、スレッドが起きないようになります。
私の質問: * pthread_cond_broadcastはいつ返されますか?私。すべてのスレッドが起動したか、前に戻ることができた後にのみ戻ってくるという保証はありますか? *この問題の推奨される解決方法はありますか?
ありがとう、これはトリックを行うようです。 –