gpt4 book ai didi

multithreading - 什么可以保证在多处理器上具有自旋锁的线程在不同的处理器上运行

转载 作者:行者123 更新时间:2023-12-03 13:00:14 27 4
gpt4 key购买 nike

我知道自旋锁仅适用于多处理器。但是,如果两个线程尝试获取相同的资源,并且其中一个线程置于自旋锁中,那么如何防止另一个线程不在同一处理器上运行?如果发生这种情况,带有自旋锁的锁将防止拥有资源的锁超过该锁。在这种情况下,它将成为一个僵局。操作系统如何防止它发生?

最佳答案

首先了解一些背景事实:

  • 自旋锁(通常是锁)不限于多处理器系统。它们可以在单处理器上正常工作,甚至单线程应用程序都可以使用它们而不会造成任何损害。
  • 自旋锁不仅由OS提供,而且还具有纯用户空间实现。例如,提供 tbb::spin_mutex
  • 默认情况下,没有什么可以阻止线程在任何可用的CPU上运行(无论使用什么锁)。
  • 有重入/递归类型的锁。这意味着,如果线程一次获取它,并尝试再次获取它而不释放它,它将成功,而不是像通常的锁那样死锁。但这并不意味着仅将它们调度到相同的CPU即可将其应用于不同的线程。使用任何类型的锁,如果一个软件线程锁定了一个互斥锁,则其他线程必须等待。

  • 一个线程可能会获得锁定,并在释放锁定之前被抢占(即,被OS计时器中断)。可以将另一个线程调度到相同的CPU,并且它可能想要获取相同的锁。如果是纯自旋锁,则该线程将无用地自旋,直到超过操作系统允许的时间片并被抢占为止。最后,第一个线程将有机会运行并释放其锁,以便另一个线程将能够获取它。

    如您所见,将时间花在无望的等待上并不是很有效。因此,在尝试获取自旋锁之后,更复杂的实现会调用OS寻求帮助,以自愿将其时间片分配给其他可能会解锁当前线程的线程。

    关于multithreading - 什么可以保证在多处理器上具有自旋锁的线程在不同的处理器上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25409108/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com