我对std::memory_order_acquire
和std::memory_order_release
的理解如下:
Acquire意味着在获取栅栏之后出现的任何内存访问都不能重新排序到栅栏之前。
释放意味着在释放栅栏之前出现的任何内存访问都不能重新排序到栅栏之后。
我不明白为什么特别是 C++11 原子库,获取栅栏与加载操作相关联,而释放栅栏与存储操作相关联。
澄清一下,C++11<atomic>
库允许您以两种方式指定内存栅栏:您可以将栅栏指定为原子操作的额外参数,例如:
x.load(std::memory_order_acquire);
或者您可以std::memory_order_relaxed
单独使用和指定栅栏,例如:
x.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire);
我不明白的是,鉴于上述acquire和release的定义,为什么C++ 11专门将acquire与load关联,将release与store关联?是的,我已经看到了许多示例,这些示例展示了如何使用获取/加载和释放/存储来在线程之间同步,但总的来说,获取栅栏(防止语句后内存重新排序)和释放的想法似乎是栅栏(在语句之前防止内存重新排序)与加载和存储的想法是正交的。
那么,例如,为什么编译器不让我说:
x.store(10, std::memory_order_acquire);
我意识到我可以通过使用来完成上述操作memory_order_relaxed
,然后使用单独的atomic_thread_fence(memory_order_acquire)
语句,但同样,为什么我不能直接使用 storememory_order_acquire
呢?
一个可能的用例可能是,如果我想确保某个存储,比如说,在执行可能影响其他线程的其他语句之前x = 10
发生。