微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决无锁编程比自旋锁有什么优势?

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

我对此很困惑。虽然我知道CAS和自旋锁适合在锁争用不激烈的情况下使用,但有人可以解释在哪种情况下应使用无锁和应使用自旋锁吗?

解决方法

无锁提供了所谓的进度保证。没错,在示例线程A中确实执行了重试(即再次循环),但是仅当其他线程更改了值时,这暗示该线程能够取得进步。

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

使用无锁算法不可能出现这种情况,因为可以保证至少有一个线程可以随时取得进展。


应根据情况使用哪种。无锁算法本质上难以设计,尤其是对于树等更复杂的数据结构而言。而且,即使您拥有无锁算法,它几乎总是比串行算法慢,因此受锁保护的串行版本的性能可能更好。再者,如果数据结构竞争激烈,那么无锁版本的伸缩性将优于受锁保护的版本。但是,如果您的工作负载大部分是只读的,则读写锁也将提供良好的可伸缩性。不幸的是,这里没有一般规则...


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。