【发布时间】:2014-04-10 21:44:46
【问题描述】:
我目前正在阅读 Concurrency in Action,在第 111 页上,它提供了与 std::atomic_flag 相关的示例代码,以解释内存排序的工作原理:
f.clear(std::memory_order_release);
bool x = f.test_and_set();
但它只是说:
这里,对
clear()的调用明确要求标志是 使用释放语义清除,而对test_and_set()的调用 使用默认内存顺序设置标志和检索 旧值。
他们实际上并没有解释差异是什么。有人可以提供这些内存排序如何工作的一般概述吗?所以不仅仅是我上面提到的,我相信还有更多:
memory_order_relaxed
memory_order_release
memory_order_seq_cst
memory_order_consume
memory_order_acquire
memory_order_acq_rel
【问题讨论】:
-
他们在这里有一个不错的概述en.cppreference.com/w/cpp/atomic/memory_order
-
您能否解释一下这是什么意思:“具有此内存顺序的加载操作对受影响的内存位置执行消耗操作:先前写入由执行释放操作对该线程可见。”
-
@user997112:进一步阅读该 memory_order 文档。他们解释了获取和消费之间的区别。 Acquire 使释放之前的所有先前内存操作可见。消耗只会使对原子变量有影响的可见内存。它还说,他们所知道的唯一能发挥作用的 CPU 是 Alpha。但这并不能保证将来不会有人重用该内存设计。
-
如果您继续阅读本书,它将比您想要的更详细地解释所有差异。
标签: c++ multithreading c++11 concurrency atomic