什么保证多处理器上带有自旋锁的线程在不同的处理器上运行

时间:2014-08-20 15:47:14

标签: multithreading operating-system spinlock

我知道自旋锁只适用于多处理器。但是,如果两个线程尝试获取相同的资源而一个被置于自旋锁上,那么是什么阻止了另一个不在同一个处理器上运行?如果发生这种情况,那么具有旋转锁定的那个将阻止持有资源的那个超过。在这种情况下,它变成了僵局。操作系统如何防止它发生?

1 个答案:

答案 0 :(得分:2)

首先是一些背景事实:

  • 自旋锁(通常是锁)不限于多处理器系统。它们在单处理器上运行良好,甚至单线程应用程序也可以毫无伤害地使用它们。
  • 自旋锁不仅由OS提供,它们还具有纯用户空间实现。例如,提供tbb::spin_mutex
  • 默认情况下,没有任何东西可以阻止线程在任何可用的CPU上运行(无论它们使用何种锁)。
  • 存在可重入/递归类型的锁。这意味着如果一个线程获得它一次,并试图再次获取它而不释放,它将成功,而不是像往常锁定的死锁。但这并不意味着同样适用于不同的线程只是因为它们被安排到同一个CPU。对于任何类型的锁,如果一个软件线程锁定了互斥锁,则其他线程必须等待。

一个线程可以获取锁定并在释放锁定之前被抢占(即被OS计时器中断)。另一个线程可以安排到同一个CPU,它可能想要获取相同的锁。在纯旋转锁定的情况下,该线程将无用地旋转,直到它超过OS允许的时间片并且将被抢占。最后,第一个线程将有机会运行并释放其锁定,以便另一个线程能够获取它。

正如你所看到的,把时间花在无望的等待上是不太有效的。因此,更多复杂的实现,在多次尝试获取自旋锁后,调用操作系统寻求帮助,以便自愿将其时间片提供给可能解锁当前线程的其他线程。