我目前正在阅读“在行动中的并发性”,在第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发布于 2014-04-10 23:10:51
非正式的描述(用一袋盐):
示例(用括号上的内存顺序标记的原子操作):
t1: t2:
data = foo while not data_valid; (ACQUIRE)
data_valid = true; (RELEASE) bar = data;rcu_derefence()负责在指针的读取和取消引用之间插入一个读取屏障。请注意,有一些关于完全更改使用内存顺序的规范(在名为“拱:原子返工”的邮件列表线程上)的讨论,因为对于编译器编写人员来说,这似乎是不切实际的。特别是,当前的标准允许您发布p,而*(q + (p-p))依赖于此。有些人认为这是毫无意义的。https://stackoverflow.com/questions/22999624
复制相似问题