什么是获取释放内存顺序与顺序一致性不同的实际示例?

时间:2017-01-25 18:04:50

标签: c++ multithreading c++11 atomic memory-model

显然,顺序一致的原子操作的有效可观察行为与有效C ++程序中的仅获取释放操作不同。定义在C ++标准(自C ++ 11)或here中给出。

但是,我从未遇到过算法或数据结构的实际例子,其中获取 - 释放语义不足并且需要顺序一致性。

真实世界算法或数据结构的实用示例是什么,需要顺序一致性并且获取释放内存顺序不够?

请注意,即使是std::mutex does not guarantee sequential consistency

1 个答案:

答案 0 :(得分:7)

彼得森的算法是一个需要顺序一致性的例子。

在互斥体之前的日子里,算法用于给单个线程访问受保护区域。 该算法仅适用于2个线程,每个线程管理一个表示访问受保护区域的意图的标志。 如果两者都在(大约)同时设置标志,则两者都将退避并再次尝试。 真正的算法更先进,因为它使用'turn'标志来管理公平访问,但是为了显示seq / cst和acq / rel之间的区别,这不是必需的。

下面是Peterson算法的可编译简化版本,它实际上表明如果使用弱于顺序一致性的算法,则算法会被破坏。 有趣的是,即使在X86上也是如此,因为该平台允许对存储负载进行重新排序 存储加载重新排序的问题在于,两个线程都可以通过将me标记设置为true来表达访问受保护区域的意图,同时两个线程都从{{1}读取false标志(因为该值尚未传播到两个线程)并进入受保护区域。顺序一致性无法做到这一点。

使用him,我必须使用gcc优化进行编译,以-O3点火,而assert则不需要。 两个编译器都使用不同的方法来实现顺序一致性。

clang