代码之家  ›  专栏  ›  技术社区  ›  Troskyvs

为什么c++11的memory_order_relaxed仍然会导致序列等待?

  •  0
  • Troskyvs  · 技术社区  · 5 年前

    我希望原子负载不必等待值赋值,但我有以下代码:

    #include <atomic>
    #include <chrono>
    #include <iostream>
    #include <thread>
    using namespace std;
    atomic<bool> y;
    void write()
    {
        this_thread::sleep_for(chrono::seconds(2));
        cout<<"end sleep\n";
        y.store(true,memory_order_relaxed);
    }
    void read()
    {
        while(!y.load(memory_order_relaxed));
        cout<<"end load\n";
    }
    int main() {
        y = false;
        thread a(write);
        thread b(read);
        a.join();
        b.join();
        cout<<y.load()<<endl;
    }
    

    main将执行,等待2秒,然后打印:

    end sleep
    end load
    1
    

    我跑了很多次,结果总是一样的。

    因此,在我看来,“read()”函数的“atomic_load”将等待“write()”功能的“store”完成。这是我程序的问题,还是c++11内存顺序的设计问题?

    我使用的是ubuntu18.04和g++。谢谢。

    0 回复  |  直到 5 年前
        1
  •  2
  •   Anthony Williams    5 年前

    你的 read 函数具有 while 重复该循环,直到读取的值 y.load() 为非零。因此,这将循环,直到存储1到 y 已对该线程可见。

    呼叫 join 在打印之前 main 然后确保两个线程都已完成,从而确保1到2的存储 y 在打印之前也已完成。