c++ - Intel x86 上的 C++ 原子是否需要内存屏障?

标签 c++ multithreading assembly concurrency atomic

我认为在 Intel x86 上只有字符串和(某些)流指令需要内存屏障?对于所有其他指令,英特尔强内存排序模型可确保实现一致性吗?

假设上述内容正确,当我们的代码仅在 Intel x86 上执行时,为什么我们需要使用 C++ 原子(不包括比较和交换)?

我真的很困惑我们在哪里需要使用原子,以及使用原子是否会由于内存障碍以及整个 MESI 协议(protocol)而抑制乱序执行。

MESI 只是确保缓存在所有处理器上保持一致?

内存屏障在其他架构上很有用,因为它们将 CPU 存储缓冲区刷新到缓存,以允许 MESI 确保一致性?

什么时候我们需要在 Intel X86 CPU 上使用原子?

最佳答案

虽然 X86 具有缓存一致性,但这并不意味着它可以为您提供期望的保证。原子保存和常规保存有不同的指令,并且它们的行为也不同。 此外,同样重要的是,原子变量可以防止“破坏性”编译器优化。如果没有这些,编译器将很容易根据单线程执行模型优化您的代码,并且您的程序将出现错误。

关于c++ - Intel x86 上的 C++ 原子是否需要内存屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32104960/

相关文章:

c++ - Visual Studio 2010 C++ DLL 项目 - 没有输出 DLL 文件!

c++ - 通用函数中的模板参数

c++ - 转移 boost::asio::socket 堆栈变量的所有权

arrays - 汇编语言中String和Array的区别

performance - ARM 程序集 : Absolute Value Function: Are two or three lines faster?

assembly - 汇编中如何求偶数之和?

c# - 如何检测键盘上特殊键的向下/向上事件

c++ - 使用分析标志编译的代码不会生成 gmon.out

.net - JavascriptSerializer 或 JavascriptDeserializer 线程的不同实例上的不同线程是否安全

java - 多个端口和线程