混合原子和非原子变量和缓存
mix atomic and non atomic variables and caches
假设我们有这段代码是正确的(我希望至少):
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;
的情况下,它也是正确的吗?还是缓存刷新/失效的问题?
不管这是不是个好主意,举个例子,你的代码没问题..
您可以将 a
的原子类型替换为常规 int
(或与此相关的任何类型)。
C++ 标准使用以下短语 (§ 1.10.1-6) 支持您的情况:
Certain library calls synchronize with other library calls performed by another thread. For example, an atomic store-release synchronizes with a load-acquire that takes its value from the store
由于 threadB
加载 threadA
存储的 ready
的值(它在循环中等待), 与 [=29 同步=]关系成立。
因此,a.load()
观察到 a.store()
的记忆效应。另一种说法是 a.store()
happens-before a.load()
假设我们有这段代码是正确的(我希望至少):
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;
的情况下,它也是正确的吗?还是缓存刷新/失效的问题?
不管这是不是个好主意,举个例子,你的代码没问题..
您可以将 a
的原子类型替换为常规 int
(或与此相关的任何类型)。
C++ 标准使用以下短语 (§ 1.10.1-6) 支持您的情况:
Certain library calls synchronize with other library calls performed by another thread. For example, an atomic store-release synchronizes with a load-acquire that takes its value from the store
由于 threadB
加载 threadA
存储的 ready
的值(它在循环中等待), 与 [=29 同步=]关系成立。
因此,a.load()
观察到 a.store()
的记忆效应。另一种说法是 a.store()
happens-before a.load()