繁体   English   中英

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

[英]Lock-free data structures in C++ = just use atomics and memory-ordering?

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

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

OOOOO但是这非常复杂的。

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

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

更有可能的是,它会将实时约束传播到你的应用程序的大部分,迫使你的同事浪费相当多的时间来应对他们的任意要求,而他们的软件将很乐意在他们的生活中使用,并诉诸各种迷信好将代码混淆为提交的做法。

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


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

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

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

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

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

需要考虑的两件事:

  1. 使用C ++ 11 atomic时,只有一个操作是原子的。 但通常当您想使用互斥锁来保护更大的代码区域时。

  2. 如果将std :: atomic用于编译器无法在机器代码中转换为原子操作的类型,则编译器必须为该操作插入互斥锁。

总的来说,您可能希望坚持使用互斥锁,并且只对性能关键部分使用无锁代码,或者如果您要实现自己的结构以用于同步。

你错过了什么。 虽然无锁数据结构确实使用了您提到的原语,但只是调用它们的存在不会为您提供无锁队列。

由于C ++,无锁代码并不简单,没有C ++,操作系统通常在C / Assembly中为内存排序和防护提供类似的东西。

C ++提供了一个更好和更容易使用的界面(当然更标准化,因此你可以在多个操作系统,多个机器结构使用相同的界面),但如果你使用C ++编程无锁代码将不比没有C ++简单。仅针对一种特定类型的OS /机器结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM