我想知道,与自旋锁相比,无锁编程有哪些优点?我认为,当我们在线程(称为A)中使用CAS机制进行无锁编程时,如果其他线程更改CAS中的值,则线程仍然需要再次循环。我想就像我们用旋转锁一样!
我对此感到很困惑。虽然我知道CAS和旋锁适合在锁争不激烈的情况下使用,但是有人能解释在哪种情况下应该使用无锁的锁和应该使用自旋锁吗?
发布于 2020-08-28 14:31:09
锁定-自由提供所谓的进度保证。在您的示例中,线程A确实执行了重试(即再次循环),但前提是其他线程更改了该值,这意味着线程能够取得进展,这是正确的。
相反,持有自旋锁的线程(让我们称之为X)会阻止所有其他线程在释放锁之前取得进展。因此,如果线程X被抢占,等待锁的所有线程的执行将被有效地停止,直到X能够恢复执行并最终释放锁。如果X被无限期地停止,那么所有其他线程也会被无限期地阻塞。
这种情况在无锁算法中是不可能的,因为可以保证在任何时候至少有一个线程可以取得进展。
哪一种应该使用取决于情况。无锁算法在本质上是很难设计的,特别是对于更复杂的数据结构,如树.而且,即使您有一个无锁算法,它也几乎总是比串行算法慢,所以受锁保护的串行版本的性能可能会更好。再一次,如果数据结构竞争激烈,无锁版本将比受锁保护的版本扩展得更好。但是,如果您的工作负载主要是只读的,那么读写锁也将提供良好的可伸缩性.不幸的是,这里没有一般规则..。
如果您想了解更多关于锁自由(以及更多)的知识,我推荐这本书多处理器编程艺术。
如果你喜欢免费的替代品,我推荐保罗·弗雷泽( Paul McKenney )的预锁-自由或基尔·弗雷泽( Keir Fraser )的预锁-自由。
https://stackoverflow.com/questions/63634889
复制相似问题