我目前正在阅读“并发行动”和第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
答案 0 :(得分:1)
非正式表征(用一袋盐服用):
示例(在括号上标记其内存顺序的原子操作):
t1: t2:
data = foo while not data_valid; (ACQUIRE)
data_valid = true; (RELEASE) bar = data;
rcu_derefence()
负责在读取指针和取消引用之间在Alpha上插入读屏障。请注意,有一些关于完全改变消耗内存顺序规范的讨论(在名为"arch: atomic rework"的邮件列表线程上),因为它似乎对编译器编写者来说是不切实际的。特别是,当前标准允许您发布p
,*(q + (p-p))
依赖于此。有些人认为根本没有任何意义。