C++11如何观察原子::存储和原子::加载中的内存顺序
C++11 how to observe memory order in atomic::store and 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。但它不能使用循环。)
您所经历的不是"问题"。至少,就标准而言不是这样。
当订购被放宽时,这只意味着订购不再有保证。这并不意味着的实现必须将它们按不同的顺序排列。
不同的编译器可能会显示它;再说一遍,它可能不会。见鬼,只是更改优化可能会导致这种情况发生。再说一遍,也许不是。最终,无法保证看到另一个订单(除了某种或类似工具的模拟)。仅仅因为你声明可能的事情是可能的,并不能确保它会发生或必须发生。
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 原子加载和存储与内存顺序放宽
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 使用C++原子库,我应该使用什么样的内存顺序进行加载,然后进行比较交换
- 当某些错误可以接受时,顺序加载存储原子的内存顺序应该是什么
- 保存对象并以任何特定顺序加载它们
- 是否可以在 C++11 中使用后续顺序一致加载对存储版本进行重新排序
- C++11如何观察原子::存储和原子::加载中的内存顺序
- 操纵动态库加载的符号解析顺序
- 函数指针和DLL加载顺序
- 二进制搜索- c++按照特定的顺序将名字列表写入文件,而不将它们全部加载到内存中