让我们假设我有以下代码(玩具示例):
std::atomic<K *> data;
K *old_value = NULL;
K *new_value = new K();
if (!data.compare_exchange_strong(old_value, new_value, m1, m2)) {
delete new_value;
}
do_something(old_value);或
std::atomic<K *> data;
K *i = data.load(m3);
K *j;
do {
j = i + 1;
} while (data.compare_exchange_weak(i, j, m4, m5);
do_something(j);m1、m2、m3、m4和m5的有效值是什么?我的理解是,所有的代码都可以是std::memory_order_relaxed的,因为整个代码在很大程度上依赖于前面操作的结果(假设do_something只使用指针,不改变全局的共享状态)。我的读数正确吗?
发布于 2012-08-02 01:29:25
这个问题只有在具有定义良好的共享状态的多线程场景中才有意义。在不知道其他线程做什么的情况下,我只能假设它读/写data。有了这个单点的同步点,完全放松的排序应该可以做得很好。对于独立于其他同步点考虑的任何给定原子,操作仍然是原子的,它们的相对顺序仍然是正确的。
现在,如果共享状态由多个变量组成(这就是“排序”发挥作用的地方),这将是一个完全不同的故事;您将不得不担心获取/释放/等语义。在这种情况下:
relaxed
data1,线程2设置data2)所做的多个变量的更改将以相同的顺序对所有其他线程可见。acquire/release (分别在每次读/写时使用;对于不同的排序参数模式,第一项可能会变得更加宽松)
seq_cst (同样,在每次读/写时使用):
https://stackoverflow.com/questions/11763571
复制相似问题