是否存在这样的情况:我们希望加载一个带有memory_order_acquire
的原子,而没有对应于带有memory_order_release
的同一原子的存储?
例如,如果我有这段代码:
std::atomic<uint64_t> state; std::atomic<uint64_t> count; // Thread 1 while (true) { auto expected = state.load(memory_order_relaxed); auto desired = get_desired(expected); if (state.compare_exchange_weak(expected, desired, memory_order_relaxed, memory_order_relaxed) { <----- (A) count.fetch_add(1, memory_order_relaxed); <---- (B) break; } } // Thread 2 auto state = state.load(memory_order_acquire); <----- (C) auto count = count.load(memory_order_relaxed); <----- (D)
线程2中的memory_order_acquire
应该可以防止count
的加载在state
的加载之前移动,但由于我们在其他地方都使用memory_order_relaxed
,我是否正确地说,线程2可能会看到更新后的count
值,该值可能比state
更新,即在看到来自(A)的compare_exchange
的效果之前,先看到(B)的效果?
如果我希望(A)的效果在线程2加载到(C)中时始终可见,那么我会将(B)更改为memory_order_release
,在(D)中使用memory_order_acquire
,并颠倒(C)和(D)的顺序吗?