0

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

我对此很困惑。虽然我知道CAS和spin-lock适合在锁竞争不激烈的情况下使用,但有人可以解释一下在哪些场景应该使用lock free和应该使用spin lock?

4

1 回答 1

8

无锁提供了所谓的进度保证。您是对的,在您的示例线程A中确实执行了重试(即再次循环),但前提是其他线程更改了 value,这意味着该线程能够取得进展。

相反,一个X持有自旋锁的线程(我们称之为它)会阻止所有其他线程继续进行,直到锁被释放。因此,如果线程X被抢占,所有等待锁的线程的执行都会被有效地停止,直到X可以恢复执行并最终释放锁。如果X要无限期地停止,那么所有其他线程也将被无限期地阻塞。

这种情况对于无锁算法是不可能的,因为可以保证在任何时候至少有一个线程可以取得进展。


应该使用哪个取决于情况。无锁算法本质上难以设计,尤其是对于更复杂的数据结构,如树。即使你有一个无锁算法,它几乎总是比串行算法慢,所以受锁保护的串行版本可能会执行得更好。再说一次,如果数据结构竞争激烈,无锁版本的伸缩性将比受锁保护的版本更好。但是,如果您的工作负载主要是只读的,那么读写锁也将提供良好的可扩展性。不幸的是,这里没有一般规则......


如果你想了解更多关于无锁(以及更多)的知识,我推荐这本书The Art of Multiprocessor Programming
如果你更喜欢免费的替代品,我推荐并行编程很难,如果是,你能做些什么呢?Paul McKenney 或Keir Fraser 的Practicallock-freedom

于 2020-08-28T14:31:09.207 回答