在 C++ 中,获取/释放原子访问和与栅栏结合的宽松访问之间有什么有效的区别吗?

Wal*_*ltK 5 c++ multithreading memory-model memory-barriers stdatomic

具体来说,以下之间是否有任何有效的区别:

i = a.load(memory_order_acquire);
Run Code Online (Sandbox Code Playgroud)

或者

a.store(5, memory_order_release);
Run Code Online (Sandbox Code Playgroud)

atomic_thread_fence(memory_order_acquire);
i = a.load(memory_order_relaxed);
Run Code Online (Sandbox Code Playgroud)

或者

a.store(5, memory_order_relaxed);
atomic_thread_fence(memory_order_release);
Run Code Online (Sandbox Code Playgroud)

分别?

非宽松原子访问是否提供信号栅栏和线程栅栏?

csh*_*shu 3

你需要

atomic_thread_fence(memory_order_release);
a.store(5, memory_order_relaxed);
Run Code Online (Sandbox Code Playgroud)

i = a.load(memory_order_relaxed);
atomic_thread_fence(memory_order_acquire);
Run Code Online (Sandbox Code Playgroud)

取代

a.store(5, memory_order_release);
Run Code Online (Sandbox Code Playgroud)

i = a.load(memory_order_acquire);
Run Code Online (Sandbox Code Playgroud)

非宽松原子访问确实提供了信号栅栏和线程栅栏。