C ++ 11如何在atomic :: store和atomic :: load中观察内存顺序

时间:2015-12-05 12:50:44

标签: c++ c++11 atomic

更新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。但它不能使用循环。)

1 个答案:

答案 0 :(得分:3)

您遇到的问题不是&#34;问题&#34;。至少,不是标准所涉及的。

放宽订购时,这仅表示不再保证订购。这并不意味着实现必须将它们放入不同的顺序。

不同的编译器可能会显示它;然后,它可能不会。地狱,只是改变优化可能会导致它发生。然后,也许不是。最终你无法做任何事情来保证看到其他顺序(在某些类型或类似工具的仿真之外)。仅仅因为你陈述可能可能的东西并不能确保它会或者必须发生。