ミューテックスとセマフォはいつ使用すればよいのでしょうか?
ベストアンサー1
何をいつ使うか覚える方法は次のとおりです -
セマフォ:他のスレッドから起動を指示されるまでスリープ状態にしたい場合には、セマフォを使用します。セマフォの「ダウン」は 1 つのスレッド (プロデューサー) で発生し、セマフォの「アップ」(同じセマフォの場合) は別のスレッド (コンシューマー) で発生します。例: プロデューサー - コンシューマー問題では、プロデューサーは少なくとも 1 つのバッファー スロットが空になるまでスリープ状態にします。バッファー スロットが空になったことを通知できるのはコンシューマー スレッドだけです。
ミューテックス:他のスレッドによって同時に実行されるべきではないコードを実行する場合は、ミューテックスを使用します。ミューテックスがダウンすると、1つのスレッドでミューテックスがアップします。しなければならない同じスレッドで後で発生する可能性があります。例: グローバル リンク リストからノードを削除する場合、ノードの削除中に別のスレッドがポインターを操作しないようにする必要があります。ミューテックスを取得してノードの削除に忙しいときに、別のスレッドが同じミューテックスを取得しようとすると、ミューテックスを解放するまでスリープ状態になります。
スピンロック:ミューテックスを本当に使用したいが、スレッドがスリープできないときは、スピンロックを使用します。例: OS カーネル内の割り込みハンドラはスリープしてはなりません。スリープすると、システムがフリーズまたはクラッシュします。割り込みハンドラからグローバルに共有されたリンク リストにノードを挿入する必要がある場合は、スピンロックを取得 - ノードを挿入 - スピンロックを解放します。