複数のスレッドが単一のセマフォで待機できますか? はいの場合、セマフォがダウンすると、どちらが再開されますか?
3 に答える
のドキュメントがsem_post
示唆するように、
この操作の結果のセマフォの値が 0 の場合、セマフォを待ってブロックされたスレッドの 1 つが への呼び出しから正常に戻ることが許可され
sem_wait()
ます。シンボル_POSIX_PRIORITY_SCHEDULING
が定義されている場合、ブロック解除されるスレッドは、ブロックされたスレッドに有効なスケジュール ポリシーとパラメーターに適した方法で選択されます。スケジューラSCHED_FIFO
との場合SCHED_RR
、最も優先度の高い待機スレッドがブロック解除され、セマフォを待機してブロックされている最も優先度の高いスレッドが複数ある場合は、最も長く待機している最も優先度の高いスレッドがブロック解除されます。シンボル_POSIX_PRIORITY_SCHEDULING
が定義されていない場合、ブロックを解除するスレッドの選択は指定されていません。
また、「アプリケーションの使用法」sem_wait
セクションで定義されているように、異なる優先度レベルのスレッドが関与する優先度逆転のケースが存在する可能性があります
Can multiple threads wait on a single semaphore ?
はい。
If yes, upon semaphore down which one will be resumed ?
まさにその1つ。どちらが OS カーネルの実装に依存するか: 待機中のスレッドを保持するために使用されるコンテナーの種類。これは FIFO キューである可能性が非常に高いため、semaphore.wait() を呼び出す最初のスレッドが最初に解放されますが、この動作に依存する方法でアプリを設計しないでください。
これは、その特定の CPU サイクルで実行するようにスケジュールされたスレッドになります。