私はpthreadと待機条件を学んでいます。私が知る限り、典型的な待機スレッドは次のようになります。
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
私が理解できないのは、スレッドをウェイクアップするためwhile(!condition)
に使用しても、なぜラインが必要なのかということです。pthread_cond_signal()
pthread_cond_broadcast()
使用する場合、条件をテストする必要があることを理解できます。これは、待機中のすべてのスレッドをウェイクアップし、そのうちの1つが、ミューテックスのロックを解除する前に条件を再度falseにする可能性があるためです(したがって、その時点で実行されるべきではない別のウェイクアップされたスレッドに実行を転送します点)。しかし、私が使用する場合、私は1つのpthread_cond_signal()
スレッドだけをウェイクアップするので、条件は真でなければなりません。したがって、コードは次のようになります。
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
発生する可能性のあるスプリアス信号について何かを読みました。これ(そしてこれだけ)が理由ですか?なぜ私は偽の歌を持っている必要がありますか?それとも私が得られない何かがありますか?
信号コードは次のようになっていると思います。
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);