6

条件変数「cond」がミューテックス変数「mutex」に関連付けられているとします。condを呼び出した後にスレッドがスリープ状態で、ロックされpthread_cond_wait(&cond,&mutex)ている別のスレッドが終了した場合、そのスレッドが を呼び出す前または後に呼び出すかどうかは重要ですか? とにかくスリープ状態のスレッドがミューテックスを取得するため、 を呼び出した場合、ミューテックスのロックを解除する必要さえありますか?mutexpthread_cond_signal(&cond)pthread_mutex_unlock(&mutex)pthread_cond_signal(&cond)

編集: https://computing.llnl.gov/tutorials/pthreads/#ConVarOverviewによると、「 pthread_cond_signal() を呼び出した後にミューテックスのロックを解除できないと、一致する pthread_cond_wait() ルーチンを完了できない場合があります (ブロックされたままになります)。 " その場合、ロック解除が必要になると思いますが、おそらく後でのみ必要です。

4

2 に答える 2

4

を呼び出した後は、常にミューテックスのロックを解除する必要がありますpthread_cond_signal。ここにいくつかの良い質問/回答があります:

ミューテックスをロックせずに pthread_cond_signal を呼び出す

今すぐには思い浮かびませんが、信号を送る前にミューテックスのロックを解除したくないという正当な理由があると確信しています (競合状態に関して)。

于 2011-03-03T01:44:33.527 に答える
4

ミューテックスをロックしたままにしておくと、起動中のスレッドはミューテックスを取得できないため、ミューテックスのpthread_cond_wait再取得を待機してブロックされます。

を呼び出すためにミューテックスをロックしておく必要はありませんpthread_cond_signal。実際、ミューテックスがロックされていないときにアプリケーションロジックがシグナルを処理できる場合は、それがより良い方法です --- OS は待機中のスレッドをすぐにスケジュールでき、シグナルを待つ必要はありません。先に進む前に、スレッドを使用してミューテックスのロックを解除します。

ただし、このシナリオでは、ウェイクアップが失われないように注意する必要があり、「間違った」スレッドがウェイクアップされるという問題が発生しないようにする必要があります。単純な述語を使用する場合、これは実際には問題になりません。

于 2011-03-03T11:36:55.047 に答える