【发布时间】:2017-03-10 05:38:44
【问题描述】:
我目前正在阅读 Anthony Williams 的 C++ Concurrency in Action 书,其中有几种无锁数据结构实现。在安东尼正在写的书中关于无锁数据结构一章的前言:
这给我们带来了无锁和无等待代码的另一个缺点:虽然它可以增加数据结构上操作的并发性并减少单个线程等待的时间,但它很可能会降低整体性能。
事实上,我测试了本书中描述的所有无锁堆栈实现与前一章中基于锁的实现。而且似乎无锁代码的性能总是低于基于锁的堆栈。
什么情况下无锁数据结构更优,必须首选?
【问题讨论】:
-
这多少数据?锁定版本花费了多长时间?
-
“必须是首选?”必须是一个非常强烈的词
-
我喜欢无锁数据结构,因为它们有助于避免互斥锁死锁。当有很多争用时,它们会变慢,就像自旋锁一样。
-
简而言之:只要没有线程实际上无法获取锁,基于锁就很好。当这种情况发生时,它几乎可以保证上下文切换,太糟糕了。如果有可能多个线程实际上会同时访问同一个临界区(大量争用),那么无锁的性能会更好。
-
除了其他用例之外,它们对于以读取为主的数据非常有用。使用RCU 之类的东西,读者无需等待,甚至根本不需要进行原子操作。同步的负担可以完全由作者承担。
标签: c++ multithreading data-structures concurrency lock-free