c++ - 什么是可伸缩锁?

标签 c++ locking

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

此外,是否有任何读取锁优先于写入者?

最佳答案

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

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

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

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

  1. 争论不激烈。
  2. 关键部分很短。

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

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

我的第一条评论是您可能不想要它。如果你有高竞争,偏袒另一个会扼杀吞吐量,如果你没有高竞争,那也不会有什么不同。我认为不使用具有完全公平策略的 rw 锁的唯一原因是,如果您有必须遵守的线程优先级,那么您希望优先使用最高优先级的线程。

但如果必须的话,您可以随时自己动手。您所需要的只是一对标志(一个用于“读者现在可以离开”,一个用于“作者现在可以离开”),保护标志的条件变量,一个保护条件变量的互斥量,以及几个指示如何进行的计数器许多读者和作家都在等待。这应该是你所需要的;实现这一点应该很有启发性。

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

相关文章:

c++ - 在 C++11 中创建一个保留锁定尝试顺序的锁

rust - Arc 是否允许 RwLock 拥有多个写入器?

c++ - gcc如何链接静态库?

c++ - 共享内存中彼得森锁的问题

基于 C++ 策略的设计....作为单例或不基于模板参数的基类。

c++ - 如何在 constexpr string_view 上使用 std::string_view::remove_prefix()

c++ - 最优锁文件方法

c# - 等待前先释放锁,等待后重新获取

c++ - 检索和编辑 vector 中对象的私有(private)成员

c++ - 将二进制字符串转换为十进制