什么是可伸缩锁?它与不可扩展锁有何不同?我第一次在 TBB 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/