在实践中演示 StoreLoad 重新排序,真实的编译器和 CPU 使用宽松的存储和加载?

问题描述 投票:0回答:0
void test_relaxed()
{
    atomic<int> x{0};
    atomic<int> y{0};

    std::thread t1([&] {
        auto r1 = y.load(memory_order_relaxed); //a
        x.store(r1, memory_order_relaxed); //b
        });

    std::thread t2([&] {
        auto r2 = x.load(memory_order_relaxed); //c
        y.store(42, memory_order_relaxed); //d
    });
    
    t1.join();
    t2.join();
}

根据cppreference,上面的代码允许产生r1 == r2 == 42。但是我在x86-64和arm64平台上测试过,我无法得到这个结果。有什么办法可以得到吗?

c++ c++11 cpu-architecture memory-barriers memory-model
© www.soinside.com 2019 - 2024. All rights reserved.