除了在原子操作中标记memory ordering外,还可以单独使用fence指定memory ordering。Fence是全局的操作,它影响所执行线程中其他原子操作的ordering。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
atomic<bool> x,y;
atomic<int> z; void () {
x.store(true,memory_order_relaxed);
atomic_thread_fence(memory_order_release);
y.store(true,memory_order_relaxed);
} void read_y_then_x() {
while(!y.load(memory_order_relaxed));
atomic_thread_fence(memory_order_acquire);
if(x.load(memory_order_relaxed))
++z;
}

上面的代码中,如果没有显式的fence,z的值是不确定的。

关于fence,有几个synchronizes-with规则:

  • 如果acquire操作能读取到位于release fence后面store的写入的值,那么这个fence synchronizes-with acquire操作。
  • 如果位于acquire fence前面的load操作能够读取到release操作的值,那么这个release操作synchronizes-with acquire fence。
  • 如果位于acquire fence前面的load操作能够读取到位于release fence后面的store写入的值 大专栏  Fence和非原子操作的ordering,那么release fence synchronizes-with acquire fence。

对于上面的代码,因为y的load能够读取到前面写入的值(由于fence存在,保证了ordering),所以release fence synchronizes-with acquire fence。

Ordering Nonatomic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool x;
atomic<bool> y;
atomic<int> z; void () {
x = true;
atomic_thread_fence(memory_order_release);
y.store(true,memory_order_relaxed);
} void read_y_then_x() {
while(!y.load(memory_order_relaxed));
atomic_thread_fence(memory_order_acquire);
if(x)
++z;
}

现在把前面例子中的x换为普通的x,z的值仍然是有保证的,y必须是原子的。fence保证了x的store和y的store,以及y的load和x的load之间的ordering,而y的store和load之间有happens-before关系,因此x的store和load之间也有happens-before关系(传递)。

最新文章

  1. rinetd
  2. python 多线程实例
  3. Netty的TCP粘包/拆包(源码二)
  4. Android本地数据存储之SQLite关系型数据库 ——SQLiteDatabase
  5. 固态硬盘寿命实测让你直观SSD寿命!--转
  6. Internet信息服务找不到
  7. Codeforces Round #352 (Div. 2) C. Recycling Bottles 贪心
  8. 转!!深入理解 Session 与 Cookie
  9. linux centos安装编译phantomjs 2.0的方法
  10. MATLAB light material lighting
  11. 线程本地变量ThreadLocal
  12. Java集合类操作优化经验总结
  13. arcgis api for silverlight使用google map等多个在线地图
  14. hdu 5823 color II 状压dp
  15. QTableView
  16. 开辟sys节点用户层直接操作物理地址(比/dev/mem方便)
  17. java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader
  18. mongDb安装
  19. rnnlib依赖ubuntu环境配置
  20. Linux sed命令使用方法

热门文章

  1. nginx 报错Malformed HTTP request line, git 报错fatal: git-write-tree: error building trees
  2. JavaScript mixins
  3. 深入理解spring中的AOP原理 —— 实现MethodInterceptor接口,自已动手写一个AOP
  4. 转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨
  5. JavaSE--Java 的基本程序设计结构
  6. Django专题-中间件
  7. fiddler抓包可以抓到电脑数据抓不到手机上的数据------防火墙问题
  8. InsertionSort(插入排序)原理及C++代码实现
  9. ESLint javascript格式要求
  10. 蓝桥杯 传球游戏(dp)