无锁编程相比自旋锁有什么优势?

What are the advantages of lock-free programming over spin lock?

我想知道无锁编程相对于自旋锁有哪些优势?我认为当我们在一个线程(称为A)中使用CAS机制进行无锁编程时,如果其他线程改变了CAS中的值,一个线程还需要再循环一次。我认为这就像我们使用自旋锁一样!

我对此很困惑。虽然我知道CAS和自旋锁适合在锁竞争不激烈的情况下使用,但是谁能解释一下在什么场景下应该使用lock free和应该使用自旋锁?

Lock-freedom 提供所谓的进度保证。你是对的,在你的示例线程 A 中确实执行了重试(即再次循环),但是 仅当其他线程更改了值 时,这意味着该线程能够取得进步。

相比之下,持有 spin-lock 的线程(我们称之为 X)会阻止所有其他线程取得进展,直到锁被释放。因此,如果线程 X 被抢占,则所有等待锁的线程的执行实际上都会停止,直到 X 可以恢复执行并最终释放锁。如果 X 无限期停止,那么所有其他线程也将无限期阻塞。

lock-free 算法不可能出现这种情况,因为它保证在任何时候至少有一个线程可以取得进展。


具体用哪个要看情况。 Lock-free 算法本身就很难设计,尤其是对于像树这样更复杂的数据结构。即使你有一个 lock-free 算法,它几乎总是比串行算法慢,所以受锁保护的串行版本可能表现更好。话又说回来,如果数据结构竞争激烈,lock-free 版本将比受锁保护的版本更好地扩展。但是,如果您的工作负载主要是 read-only,read-write-lock 也将提供良好的可扩展性。不幸的是,这里没有通用规则...


如果您想了解有关 lock-freedom(以及更多)的更多信息,我推荐这本书 The Art of Multiprocessor Programming
如果您更喜欢免费的替代品,我推荐 Keir Fraser 的 Is Parallel Programming Hard, And, If So, What Can You Do About It? by Paul McKenney or Practicallock-freedom