我基本上有两个密切相关的问题,它们都是基于这个SO问题:Thread synchronization problem with c++ std::atomic variables
正如cppreference.com所解释的:
对于内存顺序获取:
具有此内存顺序的加载操作在受影响的内存位置上执行获取操作:在此加载之前,当前线程中的任何读取或写入都不能重新排序。释放同一原子变量的其他线程中的所有写入在当前线程中可见
对于内存顺序释放:具有此内存顺序的存储操作执行释放操作:在此存储之后,当前线程中的任何读取或写入都不能重新排序。当前线程中的所有写入在获取相同原子变量的其他线程中可见
1.为什么人们说必须使用memory_order_seq_cst才能使该示例正常工作?如果memory_order_acquire不像官方文档所说的那样工作,它的用途是什么?文档清楚地说:其他线程中释放同一原子变量的所有写入操作在当前线程中都是可见的。
1.为什么SO question中的示例永远不应该输出“bad\n”?这对我来说没有任何意义。
我做了功课,阅读了所有可用的文档,所以问题/答案,谷歌搜索等...但是,我仍然不能理解一些事情。
1条答案
按热度按时间omhiaaxx1#
你的关联问题有两个原子变量,你的“cppreference”引号特别提到了“sameatomic variable”。这就是为什么参考文本没有涵盖关联问题。
进一步引用cppreference的话:
memory_order_seq_cst
:...“存在单个总顺序,其中所有线程以相同顺序观察所有修改”。因此,*****包含对两个原子变量的修改。
从本质上讲,
memory_order_release
的设计问题在于它是GOTO
的数据等价物,我们知道这是从Dijkstra开始的一个问题。而memory_order_acquire
是COMEFROM
的等价物,这通常是留给愚人节的。我还不相信它们是C++的好补充。