C++ 什么是可伸缩锁?
什么是可伸缩锁?它与不可伸缩的锁有何不同?我第一次看到这个术语是在TBB rw锁的上下文中,无法决定使用哪个C++ 什么是可伸缩锁?,c++,locking,C++,Locking,什么是可伸缩锁?它与不可伸缩的锁有何不同?我第一次看到这个术语是在TBB rw锁的上下文中,无法决定使用哪个 此外,是否有任何rw锁优先于读写器?术语“可伸缩锁”或“不可伸缩锁”没有正式定义。它的意思是,一些锁定算法、技术或实现即使在存在大量锁争用的情况下也能表现得相当好,而有些则不然 有时问题是算法问题。例如,优先级继承的简单实现可能需要O(n)个工作来释放锁,其中n是等待线程的数量。这意味着每个等待服务的线程都有O(n^2)个工作 有时问题与硬件有关。简单的自旋锁(例如,锁缓存线共享且收单机
此外,是否有任何rw锁优先于读写器?术语“可伸缩锁”或“不可伸缩锁”没有正式定义。它的意思是,一些锁定算法、技术或实现即使在存在大量锁争用的情况下也能表现得相当好,而有些则不然 有时问题是算法问题。例如,优先级继承的简单实现可能需要O(n)个工作来释放锁,其中n是等待线程的数量。这意味着每个等待服务的线程都有O(n^2)个工作 有时问题与硬件有关。简单的自旋锁(例如,锁缓存线共享且收单机构不后退的实现)不能在单总线互连的SMP硬件上扩展,因为写入缓存线需要CPU获取缓存线,而CPU互连是单争用点。如果有n个CPU试图同时获取同一个锁,那么最终可能会有O(n)个总线通信量来获取锁。同样,这意味着所有n个CPU都需要O(n^2)个时间才能满足要求 通常,除非满足以下两个条件,否则应避免使用不可扩展的锁:
但如果你必须的话,你可以自己滚。您只需要两个标志(一个用于“Reader can go now”,另一个用于“writer can go now”)、保护标志的条件变量、保护条件变量的单个互斥体,以及指示有多少读写器正在等待的两个计数器。这就是你所需要的;实现这一点应该很有启发性。。非常清晰的解释。非常感谢你。我完全同意你关于吞吐量问题的评论,但不适用于我目前的情况。