首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11原子自动解决多核竞争变量读写?

c++11原子自动解决多核竞争变量读写?
EN

Stack Overflow用户
提问于 2018-11-10 04:59:34
回答 2查看 227关注 0票数 0

我知道,当多线程读取和写入变量时,原子将对类型"T“变量应用锁,确保其中只有一个线程正在执行R/W。

但是在一台多cpu核计算机中,线程可以在不同的核心上运行,不同的内核会有不同的L1-缓存、L2-缓存,而共享L3-缓存。我们知道有时C++编译器会优化要存储在寄存器中的变量,这样如果变量没有存储在内存中,那么变量上不同的核心缓存之间就没有内存同步。

所以我担心/问题是,如果一个原子变量被优化为编译器的某个寄存器变量,那么它就不会存储在内存中,当一个核心写入它的值时,另一个核心可以读出一个陈旧的值,对吗?这种数据的一致性有保证吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-10 08:08:30

原子不会像你模糊描述的那样“解决”问题。它为基于顺序的内存的一致性提供了某些非常具体的保证。

不同的编译器在不同的平台上以不同的方式实现这些保证。

在x86/64上,不对原子整数和指针使用锁,以达到合理的大小。硬件条件是比标准要求更强的保证,使得一些更深奥的选项等同于完全一致。

我无法完全回答您的问题,但我可以指出正确的方向;您需要了解的主题是“C++内存模型”。

话虽如此,原子的存在是为了避免你所描述的问题。如果您要求完全内存顺序一致性,而线程A修改X然后Y,则没有其他线程可以看到Y修改,但看不到X。C++标准没有指定提供这种保证的方式;缓存行失效,使用特殊的访问指令,禁止编译器基于寄存器的优化,等等都是编译器所做的事情。

请注意,C++内存模型是为C++17改进、修正和抛光的,以便描述新的并行算法的行为,并允许使用正确的标志在GPU硬件(以及其他点)上高效地实现它们,进而影响新GPU硬件提供的保证。因此,讨论内存模型的人可能会感到兴奋,并谈论比您主要关注的C++11更现代的问题。

这是一个很复杂的话题。编写您认为是可移植的代码是非常容易的,但它只在特定的平台上工作,或者通常只在测试它的平台上工作。但这仅仅是因为线程处理很难。

票数 3
EN

Stack Overflow用户

发布于 2018-11-10 05:30:52

你可能在找这个:

intro.progress/18实现应该确保原子或同步操作分配的最后一个值(按修改顺序排列)在有限的时间内对所有其他线程都是可见的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53236113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档