让我们说这段代码是正确的(我希望至少):
std::atomic<int> a;
std::atomic<bool> ready{false};
void threadA() {
a.store(666, std::memory_order_relaxed);
ready.store(true, std::memory_order_release);
}
void threadB() {
while(!ready.load(std::memory_order_acquire));
process(a.load(std::memory_order_relaxed));
}
我的问题是:如果您使用的是int a;
而不是std::atomic<int> a;
,那么它也是正确的吗?或者是否存在缓存刷新/失效的问题?
答案 0 :(得分:1)
这是否是一个好主意,例如,你的代码很好..
您可以将a
的原子类型替换为常规int
(或任何类型)。
C ++标准使用以下短语(第1.10.1-6节)支持您的案例:
某些库调用与另一个线程执行的其他库调用同步。例如,原子存储释放与从存储
获取其值的load-acquire同步
由于threadB
加载了由ready
存储的threadA
的值(它正在循环中等待它),因此建立了 synchronize-with 关系。
因此,a.load()
会观察a.store()
的记忆效应。另一种说法是a.store()
发生在 a.load()
之前