2

ミューテックスがロックされていると想像してください。ミューテックスをロックするために待機している他のスレッドの数に制限はありません。ミューテックスのロックを解除すると、それらのスレッドの 1 つがクリティカル セクションに入るために選択されます。しかし、私はどれを制御することはできません。特定のスレッドをクリティカル セクションに入れたい場合はどうすればよいですか?

POSIXミューテックスを使用してこれを行うことはできないと確信していますが、別の同期オブジェクトを使用して動作をエミュレートできますか?

4

1 に答える 1

4

ミューテックス、条件変数、およびスレッド ID を使用して、それを実現できます。

ミューテックスのロックを解除する前に、スレッドはターゲット スレッド ID を設定し、条件変数をブロードキャストして、ミューテックスを解放します。待機中のスレッドが起動し、mutex をロックして、ターゲット スレッド ID がこのスレッド ID と等しいかどうかを確認します。そうでない場合、スレッドは待機に戻ります。

このメソッドを最適化して、待機中のすべてのスレッドをウェイクアップしてターゲット スレッド ID を確認してから待機に戻ることを回避するには、待機中のスレッドごとに個別の条件変数を使用します。このようにして、シグナルスレッドは特定のターゲットスレッドの条件変数を通知します。


もう 1 つのオプションは、特定のスレッドに送信されるシグナルを使用することです。SIGRTMINこの目的のために使用するとしましょう。まず、すべてのスレッドが開始時にこのシグナルをブロックするため、スレッドが待機していないときにシグナルが保留になり、失われることはありません。スレッドがミューテックスをロックしたい場合、最初に呼び出しsigwait()、アトミックにブロックを解除SIGRTMINして待機するか、すでに保留中のものを配信します。スレッドがシグナルを受信すると、続行してミューテックスをロックできます。シグナリング スレッドはpthread_kill(target_thread_id, SIGRTMIN)、特定のスレッドをウェイクアップするために使用します。

于 2012-10-03T09:01:08.380 に答える