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

标签 c++ multithreading c++11 thread-safety memory-barriers

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

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/

相关文章:

objective-c - iOS 对上传任务进行排队

java - 传递给 CompletableFuture SupplyAsync Executors.newFixedThreadPool(10) 或 new ForkJoinPool(10) 哪个执行器更好

iOS 6 处理托管对象后台保存的标准方法是什么(2013 年)?

c++ - 包装二进制缓冲区 - 可能没有多余的移动/复制?

c++ - 在两个 vector 中对 vector 进行空间高效解包的优雅方法

c++ - Opengl 相机和乘法矩阵

C++ 时钟保持为零

c++ - 从 C/C++ 中的 .csv 文件中读取汉字

c++ - 代码可以编译,但是不起作用! cmd窗口正处于理想状态,但没有任何反应

c++ - 为什么我需要在 map::emplace 中为不可复制对象的单个 arg 构造函数使用分段构造?