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)
}
}