1

cppreference说这std::memory_order_acquire将防止读写在它之前重新排序。所以我可以std::memory_order_acquire只用于防止在运行时重新排序而没有相应的std::memory_order_release. 例如

#include <atomic>
#include <stdint.h>

std::atomic<uint32_t> g_counter{};//Counter for thread in Fun
std::atomic<void*> g_data{};
void Fun()
{
    g_counter.fetch_add(1, std::memory_order_acquire);//Warning:`fetch_add` maybe reorder after next 'load'
    void *data = g_data.load(std::memory_order_acquire);
    g_counter.fetch_sub(1, std::memory_order_relaxed);//just memory_order_relaxed will be ok
}

真的吗?

4

1 回答 1

0

经过几天的学习。我认为 'release' 和 'acuire' 可以分开使用,以防止相应的重新排序。但是这个例子有问题。这是一个关于 'fetch_add' 的存储操作,并且存储可能在下一次加载后重新排序。正确的方法是将 fetch_add 和 next load 都更改为 memory_order_seq_cst 操作。

于 2019-04-23T05:21:47.547 回答