多个线程之间的获取-释放内存顺序



代码:

std::atomic<int> done = 0;
int a = 10;
void f1() {
a = 20;
done.store(1, std::memory_order_release);
}
void f2() {
if(done.load(std::memory_order_acquired) == 1) {
assert(a == 20);
}
}
void f3() {
if(done.load(std::memory_order_acquired) == 1) {
assert(a == 20);
}
}
int main() {
std::thread t1(f1);
std::thread t2(f2);
std::thread t3(f3);
t1.join();
t2.join();
t3.join();
}

问题是,如果线程 2 和 3 都看到done == 1,将 断言a == 20两个线程中都成立? 我知道获取发布适用于一对线程。但是 它也在多个线程中工作?

是的。 释放-获取关系对所有线程对(访问相同的原子位置!(分别成立,并保证释放之前的所有写入(按程序顺序显示(对任何相应获取之后的所有读取(按程序顺序显示(可见。

发布就像出版报纸(没有定义周期的报纸(,而获取就像现在购买后期版本,然后发现它的内容(不在乎它是哪个版本,或者它是哪一天(。(您很少需要对这些共享原子进行版本控制,尽管有时可能需要这样做。

任何数量的人都可以购买报纸。重要的是,印刷的东西在印刷时是真实的,如果它们是不变的真理,比如纪念碑的创造(假设不变(,那么它仍然是真的。

因此,发布操作发布时的真实内容,正确的设计可以保证这些事实在您可以"购买"(获取(发布时不会改变。任意数量的线程都可以看到这些事实。

最新更新