如何解决C++ 原子栅栏和重新排序
我对以下代码有疑问:
std::shared_ptr<int> shared_obj = std::make_shared<int>(222);
std::atomic<bool> flag = false;
...
THREAD 1
while (running.load(std::memory_order_relaxed)) {
if (std::shared_ptr<int> v = std::atomic_load(&shared_obj)) {
flag.store(1,std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_release);
do_work(v);
v.reset();
flag.store(0,std::memory_order_release);
}
}
...
THREAD 2
std::atomic_exchange(&shared_obj,std::shared_ptr<int>{});
while (flag.exchange(true,std::memory_order_relaxed))
;
// at this point,it's guaranteed that the underlying object of shared_obj is deleted.
我的观点
-
我的代码中的
-
atomic_thread_fence
可防止跨栅栏的操作重新排序。 - 线程 2 完成循环后,保证删除
shared_obj
的底层对象。 -
flag.exchange
是 RMW 操作,这意味着无论选择的flag
是什么,它都会始终对最新的std::memory_order
值进行操作。
这些说法正确吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。