什么是可扩展锁?它与不可扩展的锁有什么不同?我第一次在TBB rw-lock的环境中看到这个术语,并且无法决定使用哪个.
另外,是否有任何rw锁定优先于读者而不是作家?
解决方法:
“可伸缩锁定”或“不可伸缩锁定”一词没有正式定义.它意味着暗示一些锁定算法,技术或实现即使在存在大量争用锁定时也表现得相当好,而有些则没有.
有时问题是算法.例如,优先级继承的简单实现可能需要O(n)工作来释放锁,其中n是等待线程的数量.这意味着O(n ^ 2)适用于每个等待服务的线程.
有时问题与硬件有关.简单的自旋锁(例如,共享锁缓存线并且收发器不退回的实现)不能在具有单个总线互连的SMP硬件上扩展,因为写入高速缓存行需要CPU获取高速缓存行,并且CPU互连是单点争用.如果有n个CPU同时尝试获取相同的锁,则最终可能会获得O(n)总线流量来获取锁.同样,这意味着满足所有n个CPU的O(n ^ 2)时间.
通常,除非满足两个条件,否则应避免使用不可伸缩的锁:
>争用很轻.
>关键部分很短.
你真的必须知道这两个条件得到满足.关键部分在代码行方面可能很短,但在时间上不会很短.如果有疑问,请使用可扩展锁定,然后修复任何已测量的导致性能问题的锁定.
至于你的上一个问题,我不知道一个有利于读者的现成的读写锁.实际上,大多数API都没有指定策略,包括pthreads(烦人).
我的第一个评论是你可能不想要它.如果你有很高的争用,那么有利于一方争夺吞吐量,如果你没有高争用,那就不会有什么不同.关于我认为不使用具有完全公平策略的rw锁的唯一原因是,如果您必须遵守必须遵守的线程优先级,那么您希望优先级最高的线程是首选.
但如果你必须,你可以随时自己动手.所有你需要的是一些标志(一个用于“读者现在可以去”,一个用于“一个作者现在可以去”),保护标志的条件变量,保护条件变量的单个互斥锁,以及指示如何的一些计数器许多读者和作家都在等待.这应该就是你所需要的;实施这一点应该是非常有益的.