concurrency - 我们什么时候应该选择锁定而不是无锁数据结构”

标签 concurrency locking lock-free

无锁数据结构快速且可扩展。什么时候会选择对无锁数据结构实现锁定?

最佳答案

无锁数据结构仅在争用较低时才可扩展;当竞争激烈时,无锁会迅速演变成负扩展。

在争用范围内,低争用最好通过无锁来处理;通过锁定进行中等争用;通过避免锁来实现高争用。这些充其量只是经验法则。

锁定避免可以涵盖从调度或参与者等编程模型到功能的任何内容。后者仍然有点难以捉摸,但已经取得了成功,特别是在正确性受到关注的情况下。

很久以前,我开发了一个成功的商业微内核,它使用乐观锁定作为其基 native 制。内核调用将以只读模式通过内核数据结构进行,直到确定结果是什么。此时,它声明一个标志(comp&swap),并继续更新数据结构。如果竞争实体进入内核,则两者将继续竞争到断言点。失败者将重新上弦以重新开始通话,获胜者将继续。

这种机制允许非常低延迟的内核,特别是在不是很令人印象深刻的硬件上;然而,可能会出现病态情况,即给定的内核调用永远无法完成,或者需要大量冗余处理才能最终竞争。 [ 如果这看起来与 linux 的 rcu(或它所基于的 ibms rcu)有点相似,那么是的,尽管它分别比 linux 和 aix 早了十年和五年。 ]

关键在于衡量,但经验法则仍然很有值(value)。

关于concurrency - 我们什么时候应该选择锁定而不是无锁数据结构”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64938715/

相关文章:

java - 为什么条件是从 Lock 创建的,而不是使用 'new' 运算符?

java - 在仅同步访问的情况下是否需要 volatile

c# - 带有未捕获异常的 Task.Factory.StartNew 会杀死 w3wp?

sql-server - SQL Server sp_getapplock AND sp_releaseapplock 在释放锁定时抛出异常

multithreading - 获取/释放语义

c - 强制执行 C 语句的顺序?

go - 如何在Goroutine中处理错误

azure - 具有 Azure SQL 数据库的分布式锁管理器

c - 当按值传递静态变量时会导致 c 中的竞争条件

c++ - par_unseq 和 "vectorization-unsafe"函数