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

此外,是否有任何 rw-lock 将读者置于作者之上?

最佳答案

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

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

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

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

  • 竞争很轻。
  • 临界区很短。

  • 你真的要知道这两个条件都满足了。一个临界区的代码行数可能很短,但墙上的时间不会很短。如果有疑问,请使用可扩展锁,然后修复任何已测量导致性能问题的锁。

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

    我的第一个评论是你可能不想要它。如果您的争用率很高,那么偏向于另一个会降低吞吐量,而如果您没有高度争用,则不会产生任何影响。我认为不使用具有完全公平策略的 rw 锁的唯一原因是,如果您有必须遵守的线程优先级,那么您希望优先考虑最高优先级的线程。

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

    关于c++ - 什么是可伸缩锁?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15059958/

    10-10 02:47