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

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


你所经历的并不是一个“问题”。 至少,不像标准那样。

订货时放松,这只意味着订购不再保证。 这并不意味着实现必须将它们放入不同的顺序。

不同的编译器可能会显示它; 然后再次,它可能不会。 地狱,只是改变优化可能会导致它发生。 然后,也许不是。 最终没有什么可以保证看到其他订单(除了某种类似工具或类似工具的仿真外)。 仅仅因为你声明某件事情是可能的,并不能保证它会发生或必然发生。

链接地址: http://www.djcxy.com/p/30773.html

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

下一篇: Hamcrest matcher comparing double value from JSON