【发布时间】:2019-01-09 12:51:56
【问题描述】:
假设我们有 2 个线程。一名生产者和一名消费者。我们有生产数据的生产者和使用这些数据的消费者。但是守卫不是原子的!
bool isDataReady = false;
int data = 0;
void Producer() {
data = 42;
std::atomic_thread_fence(std::memory_order_release);
isDataReady = true;
}
void Consumer() {
while(!isDataReady);
std::atomic_thread_fence(std::memory_order_acquire);
assert(data == 42);
}
我想知道为什么isDataReady 上存在数据竞争。
通常,正确的代码应该是对原子 bool 变量使用 relaxed 排序。
是不是因为对 isDataReady 的写入(事务)可能在读取之前没有完成?即使是这样,这真的是个问题吗?
【问题讨论】:
-
IIRC,栅栏确保存储/加载的同步顺序。但是,您仍然可以从两个线程一次访问相同的内存位置(
isDataReady变量),其中一个线程更新它,这是数据竞争的定义(以及 C++ 中的 UB)。 -
@DanielLangr 如果存在数据竞争(即使它不是“问题”),它是 C++ 中的 UB?
-
@AntoineMorrier 是的:eel.is/c++draft/intro.races#21.sentence-3.
-
你没有提到 CPU。
标签: c++ multithreading c++11 atomic