【发布时间】:2020-05-10 10:55:08
【问题描述】:
我想在原子操作和非原子操作之间使用独立内存屏障(我认为无论如何这都不重要)。我想我了解存储屏障和负载屏障的含义,以及 4 种可能的内存重新排序; LoadLoad、StoreStore、LoadStore、StoreLoad。
但是,我总是觉得获取/发布概念令人困惑。因为在阅读文档的时候,acquire 不只讲loads,还讲stores,release 不只讲stores,还讲loads。另一方面,普通负载障碍仅向您提供负载保证,而普通商店障碍仅向您提供商店保证。
我的问题如下。在 C11/C++11 中,将独立的 atomic_thread_fence(memory_order_acquire) 视为负载屏障(防止 LoadLoad 重新排序)和将 atomic_thread_fence(memory_order_release) 作为存储屏障(防止 StoreStore 重新排序)是否安全?
如果上述内容正确,我可以使用什么来防止 LoadStore 和 StoreLoad 重新排序?
当然,我对可移植性感兴趣,我不在乎上述内容在特定平台上产生了什么。
【问题讨论】:
-
别忘了
atomic_thread_fence只是定义了WRT原子操作。 -
@curiousguy 但是
atomic_thread_fence是一个独立的屏障。我看不出类型的原子性和原子操作在这里起什么作用。内存屏障只是为您在屏障之前和/或之后的所有内容提供排序保证。 -
不使用原子能提供什么保证?
-
@curiousguy 订购保证?某些操作在其他操作之前完成?
-
@curiousguy 甚至文档都说“排序非原子和宽松的原子访问”:en.cppreference.com/w/c/atomic/atomic_thread_fence
标签: c++ c memory-barriers memory-model stdatomic