什么是可扩展锁?

时间:2013-02-25 04:10:33

标签: c++ locking

什么是可扩展锁定?它与不可扩展的锁有什么不同?我第一次在TBB rw-lock的环境中看到这个术语,并且无法决定使用哪个。

此外,是否有任何rw-lock优先考虑读者而不是作家?

1 个答案:

答案 0 :(得分:5)

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

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

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

通常,除非满足两个条件,否则应避免使用不可伸缩的锁:

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

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

    我的第一个评论是你可能不想要它。如果你有很高的争用,那么有利于一方争夺吞吐量,如果你没有高争用,那就不会有什么不同。关于我认为不使用具有完全公平策略的rw锁的唯一原因是,如果您必须遵守必须遵守的线程优先级,那么您希望优先级最高的线程是首选。

    但如果你必须,你可以随时自己动手。所有你需要的是一些标志(一个用于“读者现在可以去”,一个用于“一个作者现在可以去”),保护标志的条件变量,保护条件变量的单个互斥锁,以及指示如何的一些计数器许多读者和作家都在等待。这应该就是你所需要的;实施这一点应该非常有启发性。