什么是可伸缩锁
What is a scalable lock?
什么是可伸缩锁?它与不可扩展的锁有何不同?我第一次看到这个术语是在TBB-rw锁的上下文中,无法决定使用哪个。
此外,是否存在将读者置于作者之上的rw锁?
术语"可伸缩锁"或"不可伸缩锁定"没有正式定义。这意味着,即使在锁存在大量争用的情况下,一些锁定算法、技术或实现也会表现得相当好,而有些则不然。
有时问题是算法问题。例如,优先级继承的天真实现可能需要O(n)功来释放锁,其中n是等待线程的数量。这意味着O(n^2)为每个等待服务的线程工作。
有时问题与硬件有关。简单的自旋锁(例如,共享锁缓存线并且获取器不会后退的实现)不能在具有单个总线互连的SMP硬件上扩展,因为写入缓存线需要CPU获取缓存线,而CPU互连是单个争用点。如果有n个CPU试图同时获取同一个锁,那么您可能会使用O(n)总线流量来获取锁。同样,这意味着要满足所有n个CPU的O(n^2)时间。
通常,除非满足以下两个条件,否则应避免使用不可扩展的锁:
- 争鸣是轻松的
- 关键部分很短
你真的必须知道这两个条件都满足了。关键部分可能在代码行方面很短,但在墙时间方面不短。如果有疑问,请使用可扩展锁,然后修复测量导致性能问题的任何锁。
至于你的最后一个问题,我不知道有现成的读写锁有利于读者。实际上,大多数API都不指定策略,包括pthreads(令人恼火)。
我的第一个评论是,你可能不想要它。如果你有很高的竞争,偏袒一个会扼杀吞吐量,如果你没有很高的竞争力,那也不会有什么不同。我认为不使用具有完全公平策略的rw锁的唯一原因是,如果您有必须尊重的线程优先级,那么您希望优先使用优先级最高的线程。
但如果必须的话,你可以自己滚。您所需要的只是几个标志(一个用于"读卡器现在可以去",一个用于"写入器现在可以走")、保护标志的条件变量、保护条件变量的单个互斥体,以及指示有多少读卡器和写入器在等待的数字器。这应该是你所需要的;实现这一点应该很有指导意义。
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 是什么将程序集转换为实际可执行的材料
- 什么时候 std::initializer_list 是微不足道的可构造的?
- 对于可重定位的多平台安装,理想的 cmake 安装目录结构是什么?
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- const_forward在C++中的可选实现中做什么?
- 使用什么 std::可选 or std::unique_ptr
- 什么是可修改的rvalue
- 在发布模式下崩溃,但如果可调试为 true - 不是..什么是可能的问题
- 为什么 c++ 中需要条件来实现良好的编码实践,即使我们没有什么可写的
- 在C 中的Boost库中可辍学的蓄能器的优势是什么?
- 有什么理由更喜欢从 IDE 中运行应用程序而不是运行独立的可执行文件?
- 可修改的右值和常量右值有什么区别?
- 什么是提升等价于标准::可选空选项
- 如果 std::addressof 是 &.什么是 *& 的可读版本?
- 不能让类是微不足道的可复制的。我做错了什么?
- 在cmake中,如何以可伸缩的方式指定子目录的依赖关系
- QScrollBar的句柄如何样式化和可伸缩?
- 避免线程本地存储开销(使ffmpeg YADIF可伸缩)
- 什么是可伸缩锁