gpt4 book ai didi

c++ - std::memory_order_acquire 和 memory_order_release 可以分开使用吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:38:05 24 4
gpt4 key购买 nike

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
}

这是真的吗?

最佳答案

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

关于c++ - std::memory_order_acquire 和 memory_order_release 可以分开使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55488142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com