[英]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.