我知道自旋锁只适用于多处理器。但是,如果两个线程尝试获取相同的资源而一个被置于自旋锁上,那么是什么阻止了另一个不在同一个处理器上运行?如果发生这种情况,那么具有旋转锁定的那个将阻止持有资源的那个超过。在这种情况下,它变成了僵局。操作系统如何防止它发生?
答案 0 :(得分:2)
首先是一些背景事实:
tbb::spin_mutex
。一个线程可以获取锁定并在释放锁定之前被抢占(即被OS计时器中断)。另一个线程可以安排到同一个CPU,它可能想要获取相同的锁。在纯旋转锁定的情况下,该线程将无用地旋转,直到它超过OS允许的时间片并且将被抢占。最后,第一个线程将有机会运行并释放其锁定,以便另一个线程能够获取它。
正如你所看到的,把时间花在无望的等待上是不太有效的。因此,更多复杂的实现,在多次尝试获取自旋锁后,调用操作系统寻求帮助,以便自愿将其时间片提供给可能解锁当前线程的其他线程。