代码之家  ›  专栏  ›  技术社区  ›  Antoine Morrier

标准原子同步和非原子变量:不是陈旧的数据?

  •  3
  • Antoine Morrier  · 技术社区  · 5 年前

    我知道这个代码是正确的(除了 delete 未完成):

    #include <thread>
    #include <atomic>
    #include <cassert>
    #include <string>
    
    std::atomic<std::string*> ptr;
    int data;
    
    void producer()
    {
        std::string* p  = new std::string("Hello");
        data = 42;
        ptr.store(p, std::memory_order_release);
    }
    
    void consumer()
    {
        std::string* p2;
        while (!(p2 = ptr.load(std::memory_order_acquire)))
            ;
        assert(*p2 == "Hello"); // never fires
        assert(data == 42); // never fires
    }
    
    int main()
    {
        std::thread t1(producer);
        std::thread t2(consumer);
        t1.join(); t2.join();
    }
    

    但是,我想知道为什么在使用者线程中数据不能是 陈旧数据 . 是因为 acquire 手术?

    1 回复  |  直到 5 年前
        1
  •  5
  •   Igor Tandetnik    5 年前

    指派给 data happens-before ptr.store 打电话。访问 数据 发生在 那个调用(是的,通过与原子对象同步的方式)。因此,保证访问能看到先前分配的值。