可以分别使用std :: memory_order_acquire和memory_order_release吗?

时间:2019-04-03 06:07:12

标签: c++ multithreading c++11 synchronisation

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
}

是真的吗?

1 个答案:

答案 0 :(得分:0)

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