【发布时间】:2016-01-23 10:45:20
【问题描述】:
我有一个并发对象,它可能或可能每次都保存指向函数的指针。对象的架构如下所示:
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 是否足以执行此操作?
【问题讨论】:
标签: c++ multithreading c++11 thread-safety memory-barriers