10

の呼び出しで複数のスレッドがブロックされているとしpthread_mutex_lock()ます。ミューテックスが利用可能になると、呼び出された最初のスレッドがpthread_mutex_lock()ロックを取得しますか?つまり、への呼び出しpthread_mutex_lock()はFIFO順になっていますか?そうでない場合、それらはどのような順序で注文されていますか?ありがとう!

4

3 に答える 3

6

ミューテックスが利用可能になると、呼び出された最初のスレッドがpthread_mutex_lock()ロックを取得しますか?

いいえ。待機中のスレッドの1つがロックを取得しますが、どちらがロックを取得するかは決定されていません。

FIFOオーダー?

FIFOミューテックスはすでにパターンです。pthreadでのFIFOミューテックスの実装を参照してください。

于 2013-02-18T23:30:53.840 に答える
2

「pthread_mutex_unlock()が呼び出されたときにmutexによって参照されるmutexオブジェクトでブロックされたスレッドがあり、その結果、mutexが使用可能になった場合、スケジューリングポリシーは、どのスレッドがmutexを取得するかを決定する必要があります。」

それを除けば、あなたの質問に対する答えはPOSIX標準によって指定されていません。実装の選択に応じて、ランダムにすることも、FIFO、LIFO、またはその他の順序にすることもできます。

于 2013-02-18T23:37:47.917 に答える
0

FIFO順序は、可能な限り最も効率の悪いミューテックスウェイク順序です。本当にひどい実装だけがそれを使うでしょう。最近実行されたスレッドは、コンテキストスイッチなしで再度実行できる可能性があり、最近実行されたスレッドほど、より多くのデータとコードがキャッシュ内でホットになります。合理的な実装は、ほとんどの場合、ミューテックスを保持していたスレッドにミューテックスを与えようとします。

これを行う2つのスレッドについて考えてみます。

  1. ミューテックスを取得します。
  2. 一部のデータを調整します。
  3. ミューテックスを解放します。
  4. 手順1に進みます。

ここで、シングルコアCPUでこのコードを実行している2つのスレッドを想像してみてください。FIFOミューテックスの動作により、コンテキストスイッチごとに1つの「データの調整」が発生することは明らかです。これは最悪の結果です。

もちろん、合理的な実装は一般的に公平性にいくらかのうなずきを与えます。1つのスレッドが前進しないようにしたくありません。しかし、それはFIFOの実装を正当化することはほとんどありません!

于 2013-02-18T23:34:27.460 に答える