c ++ 11中宽松内存模型的基本机制是什么?

时间:2014-03-04 20:00:05

标签: multithreading c++11 parallel-processing memory-model

假设有两个线程,t1和t2。 t1修改全局标志f1,并且t2在大约相同的时间修改全局标志f2。如果t1尝试读取f2(或t2读取f1),它是否可以读取f2(或f1)的旧值?

这个问题根本不是关于C ++ 11的。我只想了解多线程程序在缓存一致性方面的行为,以及松弛模型如何以及为什么会出现并且有用。

1 个答案:

答案 0 :(得分:3)

轻松排序仅保证线程永远不会观察到特定内存位置的旧值而不是它观察到的最新值。如果t1在你在问题中提到的特定读取之前从未观察到f2,它可以观察到任何写入f2的值。

单独使用带有C ++ 11 memory_order_relaxed的{​​{1}}非常弱。它只是保证读/写相对于其他线程不可分割:没有线程会看到部分写入(撕裂)的值。轻松的排序实际上只有在与其他内存操作交互或读取 - 修改 - 写入操作时才有用。无论内存顺序如何,读保修写操作都可以保证读取最近写入的值。