2013-02-18 12 views
7

pthread_mutex_lock()への呼び出しで複数のスレッドがブロックされているとします。 mutexが利用可能になると、pthread_mutex_lock()を呼び出した最初のスレッドはロックを取得しますか?つまり、pthread_mutex_lock()への呼び出しはFIFO順ですか?もしそうでなければ、もしあれば、それは何ですか?ありがとう!複数のスレッドが待機している `pthread_mutex_lock()`ウェイクオーダーとは何ですか?

答えて

6

mutexが使用可能になると、pthread_mutex_lock()という最初のスレッドはロックを取得しますか?

いいえ待機中のスレッドの1つがロックを取得しますが、それを取得するスレッドは決まっていません。

FIFO順序?

FIFOミューテックスはむしろ既にパターンです。 Implementing a FIFO mutex in pthreads

+0

FIFOによって、私は 'pthread_mutex_lock'を最初に呼び出すことができました。利用可能なときに最初にロックを取得し、後続のスレッドに対してロックを取得するようにしました。私は自分自身を実装していると思います。ありがとうございました。 – shanet

+0

@shanet:* "私は、' pthread_mutex_lock 'を利用可能にしたときに最初にロックを取得する最初のスレッドを意味しています" * - はい、これはまさにFIFOミューテックスについてです。 – LihO

1

FIFOの順序付けは、可能な限り最も効率的なミューテックスウェイクオーダーです。本当にひどい実装だけがそれを使用します。直前に実行されたスレッドは、コンテキストスイッチなしで再び実行できる可能性があり、最近スレッドが実行されたときに、そのデータとコードの多くがキャッシュ内で暑くなります。合理的な実装では、最後にそれを保持していたスレッドにmutexを渡そうとします。

  1. ミューテックスを取得:

    はこれを行う2つのスレッドが考えてみましょう。

  2. いくつかのデータを調整します。
  3. ミューテックスを解放します。
  4. 今シングルコアCPU上でこのコードを実行する2つのスレッドを想像1.

に進みます。 FIFOミューテックスの動作によって、コンテキストスイッチごとに1つの「データを調整する」ことが可能であることは明らかです。これは最悪の結果です。

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

+0

"合理的"というあなたのアイデアはほとんどのものと互換性がありません。特に、リアルタイム要件には対応していません。ミューテックスを迅速にロックしロック解除する単一のスレッドは、他のスレッドでの進捗を妨げます。各優先順位レベル内のFIFO順序は、強固なリアルタイム使用のためにmutexが動作する通常の方法です。 –

+0

@R .. POSIXミューテックスは、リアルタイムではなく、意図されていません。彼らは明らかに不公正ではなく、プロセス全体の進歩を最大限にすることを意図しています。 –

+0

pthread_mutex_unlock()関数は、mutexが参照するmutexオブジェクトを解放します。mutexが解放される方法は、mutexのtype属性に依存します。 )が呼び出され、その結果ミューテックスが利用可能になる。**スケジューリング方針はどのスレッドがミューテックス**を獲得するかを決定する。 (emphasis mine) –

1

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

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

関連する問題