c++ - memory_order_seq_cst 如何与非原子操作同步?

标签 c++ multithreading synchronization atomic

如果使用单个原子变量和 std::memory_order_seq_cst,是否保证非原子操作不会被重新排序?

例如,如果我有

std::atomic<bool> quux = {false};

void foo() {
    bar();
    quux.store(true, std::memory_order_seq_cst);
    moo();
}

bar() 保证在调用 store 之后不会重新排序,并且 moo() 在调用之前不会重新排序store,只要我使用std::memory_order_seq_cst,至少从另一个线程的角度来看?

或者,换句话说,如果从另一个线程运行,以下假设是否有效?

if(quux.load(std::memory_order_seq_cst) == true) {
   // bar guaranteed to be called; its side-effects are visible
   // moo might have been called, but is not guaranteed to
} else {
   // bar might have been called, but is not guaranteed to
   // moo might have been called, but is not guaranteed to
}

请注意,我假设 barmoo 都没有使用原子操作、互斥锁、锁、栅栏或其他同步功能。

最佳答案

根据链接http://en.cppreference.com/w/cpp/atomic/memory_order由 @Maxim 链接,关于 memory_order_seq_cst 存在错误。上面的文本与 memory_order_acq_rel 交换。 memory_order_seq_cst 的文本:

memory_order_seq_cst:这个内存顺序的load操作执行acquire操作,store执行release操作,read-modify-write同时执行acquire操作和release操作,再加上所有线程存在一个总顺序以相同的顺序观察所有修改(请参阅下面的顺序一致排序)

因此在您的情况下,存储操作等同于释放,这意味着 moo() 可以在栅栏之前重新排序。

关于c++ - memory_order_seq_cst 如何与非原子操作同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41342206/

相关文章:

ios - 如何同步iOS设备上的应用数据和核心数据?

Java 类的 getter/setter 方法和单例模式中的细粒度同步

C++ - map 包含太多元素

c++ - 如何添加 char*/convert 到 std::vector<uint8_t[]>

java.nio 与每个套接字的新线程

assembly - 互斥锁和锁结构是如何实现的?

c++ - 调试时找不到 "arm-elf-g++"

c++ - 在 for 循环中将值设置为零的奇怪用法

java - Wait() 和 Notify() 概念 - Java 多线程

c - c linux中客户端服务器聊天应用程序中的多线程