C++ 什么是可伸缩锁?

C++ 什么是可伸缩锁?,c++,locking,C++,Locking,什么是可伸缩锁?它与不可伸缩的锁有何不同?我第一次看到这个术语是在TBB rw锁的上下文中,无法决定使用哪个 此外,是否有任何rw锁优先于读写器?术语“可伸缩锁”或“不可伸缩锁”没有正式定义。它的意思是,一些锁定算法、技术或实现即使在存在大量锁争用的情况下也能表现得相当好,而有些则不然 有时问题是算法问题。例如,优先级继承的简单实现可能需要O(n)个工作来释放锁,其中n是等待线程的数量。这意味着每个等待服务的线程都有O(n^2)个工作 有时问题与硬件有关。简单的自旋锁(例如,锁缓存线共享且收单机

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


此外,是否有任何rw锁优先于读写器?

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

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

有时问题与硬件有关。简单的自旋锁(例如,锁缓存线共享且收单机构不后退的实现)不能在单总线互连的SMP硬件上扩展,因为写入缓存线需要CPU获取缓存线,而CPU互连是单争用点。如果有n个CPU试图同时获取同一个锁,那么最终可能会有O(n)个总线通信量来获取锁。同样,这意味着所有n个CPU都需要O(n^2)个时间才能满足要求

通常,除非满足以下两个条件,否则应避免使用不可扩展的锁:

  • 争论很轻
  • 关键部分很短
  • 你必须知道这两个条件都满足了。关键部分可能在代码行方面较短,但在墙时间方面不短。如果有疑问,请使用可扩展锁,然后修复任何已测量到的导致性能问题的锁

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

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


    但如果你必须的话,你可以自己滚。您只需要两个标志(一个用于“Reader can go now”,另一个用于“writer can go now”)、保护标志的条件变量、保护条件变量的单个互斥体,以及指示有多少读写器正在等待的两个计数器。这就是你所需要的;实现这一点应该很有启发性。

    。非常清晰的解释。非常感谢你。我完全同意你关于吞吐量问题的评论,但不适用于我目前的情况。