更新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
}
Run Code Online (Sandbox Code Playgroud)
我知道输出可能是0.
但是,无论我尝试了多少次,我总是得到1.
这是因为我的CPU是x86架构吗?
如果没有,如何解决这个问题?
(顺便说一句,我知道CppMem.但它不能使用循环.)
你所经历的并不是一个“问题”。至少,就标准而言不是。
当订购放宽时,这只意味着不再保证订购。这并不意味着实现必须将它们放入不同的顺序。
不同的编译器可能会显示它;但话又说回来,也可能不会。天啊,仅仅改变优化就可能会导致这种情况发生。话又说回来,也许不是。最终您无法保证看到其他顺序(除了某种或类似工具的模拟之外)。仅仅因为您声明某件事可能发生并不能确保它会发生或必须发生。
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |