C++11 具有非原子变量的原子内存顺序

标签 c++ multithreading c++11 atomic memory-barriers

我不确定 c++11 中原子变量的内存排序保证如何影响对其他内存的操作。

假设我有一个线程定期调用写入函数来更新值,另一个线程调用读取函数来获取当前值。是否保证 d = value; 的效果不会在 a = version; 的效果之前看到,而会在 b = 的效果之前看到版本;?

atomic<int> a {0};
atomic<int> b {0};
double d;

void write(int version, double value) {
    a = version;
    d = value;
    b = version;
}

double read() {
    int x,y;
    double ret;
    do {
        x = b;
        ret = d;
        y = a;
    } while (x != y);
    return ret;
}

最佳答案

规则是,给定一个执行一次的write 线程,没有其他修改abd

  • 您可以随时从不同的线程读取ab,并且
  • 如果您阅读 b 并看到其中存储了 version,那么
    • 你可以阅读d;和
    • 您读取的内容将是

请注意,第二部分是否为真取决于内存顺序;默认值 (memory_order_seq_cst) 也是如此。

关于C++11 具有非原子变量的原子内存顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490696/

相关文章:

linux - pclose() 间歇性地返回 SIGPIPE

c++ - 从C++中的2个不同线程访问属于同一对象的不同数据成员

c++ - 可以打开小的 ASCII 文件,但不能打开大的二进制文件吗?

c++ - 仅在 C++ 标准中阐述?

c++ - math.h 的问题

c++ - 在基于自定义 Qt 的更新程序中下载验证

java - 当我使用多线程进行更新操作时,数据库端会发生什么?

c++ - 获取 'vector subscript out of range' 错误

c++ - 尝试返回 std::string 时出现 std::logic_error

c++ - 将空字符串传递给构造函数