自旋锁和信号量有什么区别?

Ren*_*h G 15 semaphore kernel spinlock lock

自旋锁和信号量之间的基本区别是什么?

Mac*_*tka 13

两者都管理有限的资源。我将首先描述二进制信号量(互斥量)和自旋锁之间的区别。

自旋锁执行忙等待 - 即它保持运行循环:

while (try_acquire_resource ());
...
release();
Run Code Online (Sandbox Code Playgroud)

它执行非常轻量级的锁定/解锁,但如果锁定线程将被其他试图访问相同资源的其他线程抢占,则第二个线程将简单地尝试获取资源,直到它用完 CPU 量。

另一方面,互斥锁的行为更像是:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   
Run Code Online (Sandbox Code Playgroud)

因此,如果线程试图获取被阻塞的资源,它将被挂起,直到它可用为止。锁定/解锁要重得多,但等待是“免费”和“公平”的。

信号量是一种锁,允许使用多次(从初始化中得知)——例如,允许 3 个线程同时持有资源,但不能更多。例如,它用于生产者/消费者问题或通常用于队列:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)
Run Code Online (Sandbox Code Playgroud)