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)
归档时间: |
|
查看次数: |
37501 次 |
最近记录: |