显然,顺序一致的原子操作的有效可观察行为与有效C ++程序中的仅获取释放操作不同。定义在C ++标准(自C ++ 11)或here中给出。
但是,我从未遇到过算法或数据结构的实际例子,其中获取 - 释放语义不足并且需要顺序一致性。
真实世界算法或数据结构的实用示例是什么,需要顺序一致性并且获取释放内存顺序不够?
请注意,即使是std::mutex
does not guarantee sequential consistency。
答案 0 :(得分:7)
在互斥体之前的日子里,算法用于给单个线程访问受保护区域。 该算法仅适用于2个线程,每个线程管理一个表示访问受保护区域的意图的标志。 如果两者都在(大约)同时设置标志,则两者都将退避并再次尝试。 真正的算法更先进,因为它使用'turn'标志来管理公平访问,但是为了显示seq / cst和acq / rel之间的区别,这不是必需的。
下面是Peterson算法的可编译简化版本,它实际上表明如果使用弱于顺序一致性的算法,则算法会被破坏。
有趣的是,即使在X86上也是如此,因为该平台允许对存储负载进行重新排序
存储加载重新排序的问题在于,两个线程都可以通过将me
标记设置为true
来表达访问受保护区域的意图,同时两个线程都从{{1}读取false
标志(因为该值尚未传播到两个线程)并进入受保护区域。顺序一致性无法做到这一点。
使用him
,我必须使用gcc
优化进行编译,以-O3
点火,而assert
则不需要。
两个编译器都使用不同的方法来实现顺序一致性。
clang