繁体   English   中英

与自旋锁相比,无锁编程有哪些优势?

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

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

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

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

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

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


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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM