缓存原子变量的一致性

时间:2017-04-27 10:30:24

标签: c++11 atomic

std::atomic_bool flag{false};
int data{0};

void sendRequest()
{
    // send request over network
}

bool replyReceived()
{
    // return true when reply is received over the network, false otherwise
}

void threadA()
{
    data = 123;
    flag.store(true, std::memory_order_seq_cst);  // (1)
    sendRequest();
}

void threadB()
{
    while (!replyReceived())
    {
    }
    if (flag.load(std::memory_order_acquire))  // (2)
    {
        // processing on data (3)
    }
}

在上面的列表中,threadA()threadB()由不同的线程运行。 threadA()发送网络请求,而threadB()收到请求的回复。 flag是一个原子变量,用于确保在(3)中观察到data的新值。我的问题是应该(2)总是评估为真?即使(1)必须在(2)之前实时执行,它是否可能是假的?该平台是x86。

0 个答案:

没有答案