C++中的无锁数据结构=只使用原子和内存排序?

mez*_*hic 4 c++ concurrency multithreading atomic c++11

我曾经看过"锁定免费数据结构"一词,并认为"ooooo必须非常复杂".但是,我一直在阅读"C++ Concurrency in Action",它似乎写了一个无锁数据结构,你所做的就是停止使用互斥锁/锁并用原子代码替换它们(以及可能的内存排序障碍).

所以我的问题是 - 我在这里遗漏了什么?由于C++ 11,它真的更简单吗?写一个无锁数据结构只是用原子操作替换锁的情况吗?

kur*_*eko 6

OOOOO但是这非常复杂的.

如果您没有看到互斥锁和原子访问之间的区别,那么您查看并行处理的方式就会出现问题,并且您编写的代码很快就会出现问题.

很可能它会比同等的阻塞版本运行得慢,如果你(或者说你的同事)真的不走运,它会喷出偶尔出现的不一致数据并随机崩溃.

更可能的是,它会传播实时限制到应用程序的大部分地区,迫使你的同事浪费他们的时间相当大的量与他们和他们的软件将有相当愉快的生活中没有任意要求的应对,并采取各种迷信好将代码混淆为提交的做法.

哦,好吧,只要模板人和等待的人都有他们的小乐趣......


并行处理,无论是阻塞还是假设无等待,本身都是资源消耗,复杂且实施成本高.设计一个从非平凡的并行处理中获得真正优势的软件架构是专家的工作.

相反,良好的软件设计应该将并行性限制在最低限度,使大多数程序员可以自由地实现线性,顺序代码.

至于C++,我发现这种完全的理念是将一个字符串,一个线程和一台咖啡机无差别地包装在一个同样的语法设计中,这是一个灾难性的设计选择.

C++允许你从任何东西创建一个多处理器同步对象,就像你将分配一个纯粹的字符串,这类似于在同一个展示柜中的喷枪旁边展示一支突击步枪.

毫无疑问,很多人都是通过出售突击步枪和喷枪的想法来谋生,毕竟,并没有那么不同.但他们仍然是.

  • 因此,您的体验是嵌入式领域中的一些古老的,非常奇怪的框架(通常是软件工程的典范),但当大多数人谈论"无锁数据结构"时,他们就是在讨论*数据结构*.那些已明确定义的接口将实现与调用者分开.仍然应该将实施留给专家,但使用它们是另一回事. (2认同)

Yak*_*ont 0

你缺少一些东西。虽然无锁数据结构确实使用您提到的原语,但简单地调用它们的存在不会为您提供无锁队列。