C++11 原子变量的Cache一致性

C++11 原子变量的Cache一致性,c++11,atomic,C++11,Atomic,在上面的清单中,threadA()和threadB()由不同的线程运行threadA()发送网络请求,而threadB()接收请求的回复flag是一个原子变量,用于确保在(3)中观察到数据的新值。我的问题是(2)是否应该始终评估为真?即使(1)必须在(2)之前实时执行,它是否可能为false?该平台是x86。“应该(2)始终计算为true吗?”不在代码中,如图所示。您似乎暗示了sendRequest和replyReceived之间的某种同步,但问题并不清楚其本质。如果您知道sendRequest

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

“应该(2)始终计算为true吗?”不在代码中,如图所示。您似乎暗示了
sendRequest
replyReceived
之间的某种同步,但问题并不清楚其本质。如果您知道
sendRequest
调用必须在
replyReceived
返回
true
之前发生,那么您首先就不需要
标志。@Igor:是的,我也这么想。与使用
while
循环检查(2)处的条件相比,有没有简单的方法只检查一次条件?我想把(2)改为std::memory\u order\u seq\u cst没有帮助。你可能正在寻找
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)
    }
}