什么是可扩展锁?

2023-12-31

什么是可扩展锁?它与不可扩展锁有何不同?我第一次在 TBB rw-lock 上下文中看到这个术语,但无法决定使用哪个。

另外,是否有任何 rw-lock 可以优先考虑读者而不是作者?


术语“可扩展锁”或“不可扩展锁”没有正式定义。它的意思是,即使存在大量锁争用,某些锁定算法、技术或实现也能表现得相当好,而有些则不然。

有时问题是算法问题。例如,优先级继承的简单实现可能需要 O(n) 工作来释放锁,其中 n 是等待线程的数量。这意味着每个等待服务的线程的工作时间为 O(n^2)。

有时问题与硬件有关。简单的自旋锁(例如,共享锁高速缓存行且获取方不会退出的实现)无法在具有单总线互连的 SMP 硬件上进行扩展,因为写入高速缓存行需要 CPU 获取高速缓存行,并且CPU 互连是一个单点争论。如果有 n 个 CPU 尝试同时获取相同的锁,则最终可能需要 O(n) 总线流量来获取锁。同样,这意味着所有 n 个 CPU 都需要 O(n^2) 时间才能得到满足。

一般来说,除非满足两个条件,否则应该避免不可扩展的锁:

  1. 争论很轻。
  2. 关键部分非常短。

你真的必须know即满足两个条件。关键部分的代码行数可能很短,但实际运行时间却不会很短。如果有疑问,请使用可扩展锁,然后修复任何已被锁定的锁。measured导致性能问题。

至于你的最后一个问题,我不知道有什么现成的读写锁有利于读者。实际上,大多数 API 都没有指定策略,包括 pthreads(令人烦恼)。

我的第一条评论是你可能不想要它。如果您存在高争用,则偏向其中一种会导致吞吐量下降,而如果您没有高争用,则不会产生任何影响。我认为不使用具有完全公平策略的读写锁的唯一原因是,如果您具有必须尊重的线程优先级,因此您希望优先选择最高优先级的线程。

但如果你必须的话,你可以随时推出自己的。您所需要的只是几个标志(一个表示“读者现在可以走了”,一个表示“编写者现在可以走了”)、保护标志的条件变量、保护条件变量的单个互斥锁以及几个指示如何进行操作的计数器。许多读者和作家都在等待。这应该就是你所需要的;实施这一点应该很有启发性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是可扩展锁? 的相关文章

随机推荐