我有一个并发对象,它可能或可能每次都保存指向函数的指针。对象的架构如下所示:
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/