動作中のスピンロックとセマフォの基本的な違いは何ですか?
承認された回答:
どちらも限られたリソースを管理します。まず、バイナリセマフォ(ミューテックス)とスピンロックの違いについて説明します。
スピンロックはビジーウェイトを実行します。つまり、ループを実行し続けます:
while (try_acquire_resource ());
...
release();
非常に軽量なロック/ロック解除を実行しますが、同じリソースにアクセスしようとする他のスレッドによってロックスレッドがプリエンプションされる場合、2番目のスレッドはCPUクォンタムがなくなるまでリソースを取得しようとします。
一方、ミューテックスは次のように動作します:
if (!try_lock()) {
add_to_waiting_queue ();
wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();
したがって、スレッドがブロックされたリソースを取得しようとすると、使用可能になるまで中断されます。ロック/ロック解除ははるかに重いですが、待機は「無料」で「公平」です。
セマフォは、(初期化からわかる)複数回の使用が許可されているロックです。たとえば、3つのスレッドが同時にリソースを保持することは許可されていますが、それ以上は許可されていません。これは、たとえば生産者/消費者問題で、または一般的にキューで使用されます:
P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)