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

时间:2019-01-09 12:21:05

标签: c++ multithreading c++11 atomic

我知道这段代码是正确的(除了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 个答案:

答案 0 :(得分:5)

分配给data happens-before ptr.store通话。访问data 在调用之后发生(是的,通过与原子对象的同步)。因此,保证访问可以看到先前分配的值。