了解C ++内存模型:不同运行时的不同值

时间:2015-10-08 05:34:19

标签: c++ multithreading c++11 parallel-processing atomic

以下代码有什么问题?我希望看到10由consumer1和consumer2生成,但我有时会看到-1。

a in consumer1 10

我明白了     a in consumer2 10     a in consumer1 -1 和     a in consumer2 10     memory_order_acquire

如果我理解正确,memory_order_release的线程总是与执行df$new_col = as.numeric (df$factor_col) 的线程同步。我错了吗? 我在x86-64位机器上运行。我正在编译  g ++ file.cpp -pthread -std = c ++ 11

2 个答案:

答案 0 :(得分:4)

原子变量具有非常好的属性,读取的值是之前写入的值。通过发布/获取语义,它甚至可以写入 last 值。

在这种情况下,您有2次写入和2次读取。只有-1的写入被排序 - 在读取之前,10的写入未被排序。因此,任何一个值都可能是最后写的。它保证你读-1或10而不是垃圾。

答案 1 :(得分:3)

如果您在

之前添加睡眠
global.store(10, std::memory_order_release);

然后你可以持续观察-1。

关键是std :: memory_order不是类似sempaphore的同步,而是一个相当微妙的问题。见cppreference