什么是可伸缩锁

What is a scalable lock?

本文关键字:可伸缩 什么      更新时间:2023-10-16

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

此外,是否存在将读者置于作者之上的rw锁?

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

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

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

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

  1. 争鸣是轻松的
  2. 关键部分很短

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

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

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

但如果必须的话,你可以自己滚。您所需要的只是几个标志(一个用于"读卡器现在可以去",一个用于"写入器现在可以走")、保护标志的条件变量、保护条件变量的单个互斥体,以及指示有多少读卡器和写入器在等待的数字器。这应该是你所需要的;实现这一点应该很有指导意义。