gpt4 book ai didi

c++ - std::memory_order_relaxed 是否足以检查 "Availability"?

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:01 25 4
gpt4 key购买 nike

我有一个并发对象,它可能会或可能每次都保存指向函数的指针。对象的架构如下所示:

struct ConcurrentObject{
//variables
std::atomic<void(*)()> callback;
}

所以一个线程可能会决定他想将回调附加到这个对象并将其转发:

ConcurrentObject* co = new ConcurrentObject(); //I'm using smart pointers, no worries.
//do some logic
co->callback = someCallback; //void(*)() , this may be difference callback every time

修改后我得到这个对象并检查回调是否可用:

auto co = aquireConcurrentObject();
auto callback = co->callback.load();
if (callback){
callback()
}

现在,我们知道在不指定任何内存顺序的情况下,传递的默认内存顺序是 memory_order_seq_cst,它告诉编译器(简而言之)“不要扰乱任何读取或写入指令以使程序更快, 保持代码指定的指令的相对顺序,并使其通过 cpu 可见。

我们也知道这是一个很大的性能障碍,因为编译器在它可以采取的操作方面受到更多限制。

我的问题是 - std::memory_order_relaxed 是否足以执行此操作?

最佳答案

是的,您是对的,在您的示例中,std::memory_order_relaxed 可以安全使用,因为您的代码仅依赖于回调是原子的这一事实。您的代码不受可能的内存操作重新排序的影响

关于c++ - std::memory_order_relaxed 是否足以检查 "Availability"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34962472/

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