ミューテックス、条件変数、およびスレッド ID を使用して、それを実現できます。
ミューテックスのロックを解除する前に、スレッドはターゲット スレッド ID を設定し、条件変数をブロードキャストして、ミューテックスを解放します。待機中のスレッドが起動し、mutex をロックして、ターゲット スレッド ID がこのスレッド ID と等しいかどうかを確認します。そうでない場合、スレッドは待機に戻ります。
このメソッドを最適化して、待機中のすべてのスレッドをウェイクアップしてターゲット スレッド ID を確認してから待機に戻ることを回避するには、待機中のスレッドごとに個別の条件変数を使用します。このようにして、シグナルスレッドは特定のターゲットスレッドの条件変数を通知します。
もう 1 つのオプションは、特定のスレッドに送信されるシグナルを使用することです。SIGRTMIN
この目的のために使用するとしましょう。まず、すべてのスレッドが開始時にこのシグナルをブロックするため、スレッドが待機していないときにシグナルが保留になり、失われることはありません。スレッドがミューテックスをロックしたい場合、最初に呼び出しsigwait()
、アトミックにブロックを解除SIGRTMIN
して待機するか、すでに保留中のものを配信します。スレッドがシグナルを受信すると、続行してミューテックスをロックできます。シグナリング スレッドはpthread_kill(target_thread_id, SIGRTMIN)
、特定のスレッドをウェイクアップするために使用します。