以下代码有什么问题?我希望看到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
答案 0 :(得分:4)
原子变量具有非常好的属性,读取的值是之前写入的值。通过发布/获取语义,它甚至可以写入 last 值。
在这种情况下,您有2次写入和2次读取。只有-1的写入被排序 - 在读取之前,10的写入未被排序。因此,任何一个值都可能是最后写的。它保证你读-1或10而不是垃圾。
答案 1 :(得分:3)
如果您在
之前添加睡眠global.store(10, std::memory_order_release);
然后你可以持续观察-1。
关键是std :: memory_order不是类似sempaphore的同步,而是一个相当微妙的问题。见cppreference