【发布时间】:2017-08-15 08:50:23
【问题描述】:
假设我们有这段代码是正确的(至少我希望如此):
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;,它也正确吗?还是缓存刷新/失效的问题?
【问题讨论】:
-
如果你不得不问...使用顺序一致性。除非大量注释和封装,否则即使您了解自己在做什么,维护您的代码的人也不会。
-
它并不是针对特定用例的。它更多的是理论而不是其他东西;)。但是,此代码是否可以在顺序一致性下工作?
-
对我来说看起来不错。我鼓励你观看名为“原子武器”的讲座。在那之后,这一切对我来说都是有意义的。 youtube.com/watch?v=c1gO9aB9nbs
-
经典的“完整”模式,其中原子
ready变量扮演一个标志的角色,它保护其他变量的设置。受此机制保护的变量不必是原子的。 (也就是说,是的,你可以使用int a;)。
标签: c++ multithreading c++11 atomic