use*_*112 5 c++ concurrency multithreading atomic c++11
我目前正在阅读Concurrency in Action和第111页,它提供了与a相关的示例代码std::atomic_flag,以解释内存排序的工作原理:
f.clear(std::memory_order_release);
bool x = f.test_and_set();
Run Code Online (Sandbox Code Playgroud)
但它说的是:
这里,调用
clear()显式请求使用释放语义清除标志,而调用test_and_set()使用默认内存排序来设置标志并检索旧值.
他们实际上没有解释这些差异是什么.有人可以提供这些内存排序如何工作的一般概述吗?所以不仅仅是我上面提到的那个,但我相信还有一些:
memory_order_relaxed
memory_order_release
memory_order_seq_cst
memory_order_consume
memory_order_acquire
memory_order_acq_rel
Run Code Online (Sandbox Code Playgroud)
非正式的表征(带着一袋盐来看待它):
示例(原子操作在括号中标有其内存顺序):
t1: t2:
data = foo while not data_valid; (ACQUIRE)
data_valid = true; (RELEASE) bar = data;
Run Code Online (Sandbox Code Playgroud)
rcu_derefence()负责在指针读取与其取消引用之间插入 Alpha 上的读取屏障。请注意,已经有一些关于完全更改消耗内存顺序规范的讨论(在名为“arch:atomic rework”的邮件列表线程上),因为这对于编译器编写者来说似乎不切实际。特别是,当前的标准允许您发布p,并且*(q + (p-p))依赖于此。有些人认为这根本没有意义。| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |