【发布时间】:2014-10-14 01:40:59
【问题描述】:
我知道自旋锁只适用于多处理器。但是,如果两个线程试图获取相同的资源并且一个被置于自旋锁上,那么是什么阻止另一个线程不在同一个处理器上运行呢?如果发生这种情况,带有自旋锁的那个将阻止持有资源的那个超出。在这种情况下,它变成了死锁。操作系统如何防止它发生?
【问题讨论】:
标签: multithreading operating-system spinlock
我知道自旋锁只适用于多处理器。但是,如果两个线程试图获取相同的资源并且一个被置于自旋锁上,那么是什么阻止另一个线程不在同一个处理器上运行呢?如果发生这种情况,带有自旋锁的那个将阻止持有资源的那个超出。在这种情况下,它变成了死锁。操作系统如何防止它发生?
【问题讨论】:
标签: multithreading operating-system spinlock
首先介绍一些背景事实:
tbb::spin_mutex。一个线程有可能在释放锁之前获得锁并被抢占(即被操作系统计时器中断)。另一个线程可以调度到同一个 CPU,它可能想要获取同一个锁。在纯自旋锁的情况下,该线程将无用地自旋,直到超过操作系统允许的时间片并被抢占。最后,第一个线程将有机会运行并释放它的锁,以便另一个线程能够获取它。
如您所见,将时间花在绝望的等待上效率并不高。因此,更复杂的实现,在多次尝试获取自旋锁后,调用 OS 寻求帮助,以便自愿将其时间片交给其他可能解锁当前线程的线程。
【讨论】: