の呼び出しで複数のスレッドがブロックされているとしpthread_mutex_lock()
ます。ミューテックスが利用可能になると、呼び出された最初のスレッドがpthread_mutex_lock()
ロックを取得しますか?つまり、への呼び出しpthread_mutex_lock()
はFIFO順になっていますか?そうでない場合、それらはどのような順序で注文されていますか?ありがとう!
3 に答える
ミューテックスが利用可能になると、呼び出された最初のスレッドが
pthread_mutex_lock()
ロックを取得しますか?
いいえ。待機中のスレッドの1つがロックを取得しますが、どちらがロックを取得するかは決定されていません。
FIFOオーダー?
FIFOミューテックスはすでにパターンです。pthreadでのFIFOミューテックスの実装を参照してください。
「pthread_mutex_unlock()が呼び出されたときにmutexによって参照されるmutexオブジェクトでブロックされたスレッドがあり、その結果、mutexが使用可能になった場合、スケジューリングポリシーは、どのスレッドがmutexを取得するかを決定する必要があります。」
それを除けば、あなたの質問に対する答えはPOSIX標準によって指定されていません。実装の選択に応じて、ランダムにすることも、FIFO、LIFO、またはその他の順序にすることもできます。
FIFO順序は、可能な限り最も効率の悪いミューテックスウェイク順序です。本当にひどい実装だけがそれを使うでしょう。最近実行されたスレッドは、コンテキストスイッチなしで再度実行できる可能性があり、最近実行されたスレッドほど、より多くのデータとコードがキャッシュ内でホットになります。合理的な実装は、ほとんどの場合、ミューテックスを保持していたスレッドにミューテックスを与えようとします。
これを行う2つのスレッドについて考えてみます。
- ミューテックスを取得します。
- 一部のデータを調整します。
- ミューテックスを解放します。
- 手順1に進みます。
ここで、シングルコアCPUでこのコードを実行している2つのスレッドを想像してみてください。FIFOミューテックスの動作により、コンテキストスイッチごとに1つの「データの調整」が発生することは明らかです。これは最悪の結果です。
もちろん、合理的な実装は一般的に公平性にいくらかのうなずきを与えます。1つのスレッドが前進しないようにしたくありません。しかし、それはFIFOの実装を正当化することはほとんどありません!