gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:38:25 30 4
gpt4 key购买 nike

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

最佳答案

您遇到的不是“问题”。至少,就标准而言不是。

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

不同的编译器可能会显示它;再一次,它可能不会。 hell ,仅仅改变优化可能会导致它发生。再一次,也许不是。最终您无法保证看到其他订单(除了某种模拟或类似工具)。仅仅因为您声明某事可能是可能的并不能保证它一定会或一定会发生。

关于C++11 如何观察 atomic::store 和 atomic::load 中的内存顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34105100/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com