4

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

此外,是否有任何 rw-lock 将读者优先于作者?

4

1 回答 1

6

术语“可伸缩锁”或“不可伸缩锁”没有正式的定义。这意味着一些锁定算法、技术或实现即使在对锁有很多争用的情况下也表现得相当好,而有些则不然。

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

有时问题与硬件有关。简单的自旋锁(例如,共享锁缓存行且获取者不退避的实现)不能在具有单个总线互连的 SMP 硬件上扩展,因为写入缓存行需要 CPU 获取缓存行,并且CPU 互连是单点竞争。如果有 n 个 CPU 试图同时获取同一个锁,那么您最终可能需要 O(n) 总线流量来获取锁。同样,这意味着满足所有 n 个 CPU 的 O(n^2) 时间。

通常,除非满足两个条件,否则应避免使用不可伸缩锁:

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

您确实必须知道满足这两个条件。关键部分的代码行数可能很短,但在墙上的时间上不会很短。如果有疑问,请使用可伸缩锁,然后修复任何被测量会导致性能问题的锁。

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

我的第一条评论是你可能不想要它。如果您有高争用,则偏爱一个而不是另一个杀死吞吐量,如果您没有高争用,那将没有什么不同。关于我认为不使用具有完全公平策略的 rw 锁的唯一原因是,如果您有必须尊重的线程优先级,那么您希望优先级最高的线程优先。

但如果你必须,你总是可以自己动手。您只需要几个标志(一个用于“读者现在可以去”,一个用于“作者现在可以去”),保护标志的条件变量,保护条件变量的单个互斥锁,以及几个指示如何许多读者和作家都在等待。这应该就是你所需要的;实施这一点应该很有指导意义。

于 2013-02-25T04:56:48.473 回答