C++11如何观察原子::存储和原子::加载中的内存顺序

C++11 how to observe memory order in atomic::store and atomic::load

本文关键字:加载 顺序 内存 存储 观察 何观察 C++11      更新时间:2023-10-16

更新3
在理解了什么是"内存顺序"之后,我知道这个问题和编译器完全无关
是的,因为我的CPU架构是Intel x86,所以无论我写什么代码,内存顺序效应都不会发生。

更新2
我检查了拆解代码。然而,我发现无论我如何添加代码,x.store总是在y.store之前。
问题应该来自编译器(它不会对这些代码进行重新排序),而不是CPU(据我所想)。

更新
看完评论后,我似乎不得不借用一台CPU是alpha、arm或ppc的机器
有人知道我在哪里可以使用这种机器吗?即使这不是免费的?

来源:
我正在测试下面的代码。

atomic<int> x(0);
atomic<int> y(0);
void thr1()
{
    x.store(1,memory_order_relaxed);
    y.store(1,memory_order_relaxed);
}
void thr2()
{
    while(!y.load(memory_order_relaxed))
        ;
    cout<<x.load(memory_order_relaxed)<<endl;   //may 0 or 1
}

我知道输出可能为0。
然而,无论我尝试了多少次,我总是得到1。
这是因为我的CPU是x86架构吗?

如果没有,如何解决此问题
(顺便说一句,我知道CppMem。但它不能使用循环。)

您所经历的不是"问题"。至少,就标准而言不是这样。

当订购被放宽时,这只意味着订购不再有保证。这并不意味着的实现必须将它们按不同的顺序排列。

不同的编译器可能会显示它;再说一遍,它可能不会。见鬼,只是更改优化可能会导致这种情况发生。再说一遍,也许不是。最终,无法保证看到另一个订单(除了某种或类似工具的模拟)。仅仅因为你声明可能的事情是可能的,并不能确保它会发生或必须发生。