gpt4 book ai didi

c++ - fetch_sub 和 memory_order_relaxed 用于原子引用计数?

转载 作者:太空宇宙 更新时间:2023-11-04 14:33:23 25 4
gpt4 key购买 nike

std::atomic<int> cnt = {2};

thread 1:
doFoo();
if (cnt.fetch_sub(1, std::memory_order_relaxed) == 1) {
doBazz();
}

thread 2:
doBar();
if (cnt.fetch_sub(1, std::memory_order_relaxed) == 1) {
doBazz();
}

我们能否保证 doFoo()doBar() 总是在 doBazz() 之前发生?

最佳答案

如果线程 2 调用 doBazz() 可以保证 doBazz() 看到 doBar() 的所有副作用 因为它们在同一个线程上运行并且它们之间存在前序 关系。但不能保证它会看到 doFoo() 的副作用或 doFoo() 已被调用。这是因为 doFoo()doBazz() 之间没有形成happens-before 关系。如果 thread 1 使用 std::memory_order_release 减少 cnt 并且 thread 2 使用 ,则将形成这种关系std::memory_order_acquire 在访问 cnt 时,这将在它们之间创建一个同步点。

对于线程1调用doBazz()的情况是对称的。

因此,使用 cnt.fetch_sub(1, std::memory_order_acq_rel) (std::memory_order_acq_rel 结合了 std::memory_order_acquirestd::memory_order_release) 在两个线程中将提供您所询问的保证。

我们还可以使用 cnt.fetch_sub(1, std::memory_order_release) 并在调用 之前调用 std::atomic_thread_fence(std::memory_order_acquire) doBazz() 实现相同的效果。

关于c++ - fetch_sub 和 memory_order_relaxed 用于原子引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38448886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com