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

When should we choose locking over lock-free data structures"

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

无锁数据结构难以实现,因此在性能不是问题的大多数情况下应该首选锁定,因为它可以实现可维护性。

即使性能是一个问题,无锁更快也可能是例外而不是常态。以 JVM 为例:锁变得如此先进,以至于许多已开发的无锁数据结构很容易被更简单的基于锁的替代方案大大超越。

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

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

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

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

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

关键在于衡量,但经验法则仍然有价值。