小编kma*_*loc的帖子

轻松排序c ++ 11内存模型

我在x64上测试了c ++ 11内存模型的轻松排序语义,我被告知在x86/64上只存在存储/加载重新排序,所以我编写了以下程序来测试轻松排序.

理想情况下,如果存在重新排序(它确实存在),那么我的程序应该达到"g_a == g_b == 0"的情况,但我测试了很长时间,并且从未得到预期的结果,任何人都可以帮忙解释一下为什么?谢谢.

[更新]

抱歉忘记提及我使用的编译器,在Linux x86/64上使用g ++ 4.8.3编译时,以下代码将无法正常工作.感谢@Mat的提醒,然后我尝试使用clang ++ 3.4.2编译它,这次我看到了重新排序,所以它可能是g ++中的一个错误.

#include <iostream>
#include <thread>
#include <atomic>

using namespace std;
atomic<int> g_a, g_b;
atomic<int> g_x, g_y;
memory_order order = memory_order_relaxed;

void bar1()
{
    register int t = 0;
    g_x.store(42, order);
    t = g_y.load(order);
    g_a = t;
}

void bar2()
{
    register int t = 0;
    g_y.store(24, order);
    t = g_x.load(order);
    g_b = t;
}

int main()
{
    for (int i = 0; i < 1000000; …
Run Code Online (Sandbox Code Playgroud)

memory-model c++11

5
推荐指数
1
解决办法
239
查看次数

标签 统计

c++11 ×1

memory-model ×1