Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279614
  • 博文数量: 94
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 202
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-08 20:07
文章分类

全部博文(94)

文章存档

2017年(19)

2016年(30)

2015年(12)

2014年(33)

我的朋友

分类: LINUX

2017-05-04 11:13:19

在阅读环形队列的实现代码的时候,该队列只适用于one concurrent reader and one concurrent writer(单生产---单消费者模型),代码中间有个barrier函数,
实现:

点击(此处)折叠或打开

  1. #if defined (CONFIG_MIPS)

  2. #define barrier() __asm__ __volatile__(".set push; .set mips4; sync; .set pop": : :"memory")

  3. #else /* all other CPUs */

  4. #define barrier() __asm__ __volatile ("" : : : "memory")

  5. #endif



相信有很多像我这样菜鸟级的人不明白这是干嘛用的,查了一下资料,
引自:

creates a compiler level memory barrier forcing optimizer to not re-order memory accesses across the barrier.

创建一个编译级的内存屏障,用以阻止编译器跨越该屏障去对内存访问顺序做重新编排。简单说就是当编译器看到barrier函数时,对后面代码内存的访问顺序不做优化处理。

例如:

点击(此处)折叠或打开

  1. int c(int *d, int *e) {
  2.         int r;
  3.         d[0] += 1;
  4.         r = e[0];
  5.         d[1] += 1;
  6.         return r;
  7. }

在编译器做了优化后,内存访问顺序可能是d[0] & d[1] ---> e[0];

点击(此处)折叠或打开

  1. 00000000 <c>:
  2.    0: 4603 mov r3, r0
  3.    2: c805 ldmia r0, {r0, r2}
  4.    4: 3001 adds r0, #1
  5.    6: 3201 adds r2, #1
  6.    8: 6018 str r0, [r3, #0]
  7.    a: 6808 ldr r0, [r1, #0]
  8.    c: 605a str r2, [r3, #4]
  9.    e: 4770 bx lr
代码加了内存屏障之后,阻止了编译器对内存访问顺序做优化,访问顺序d[0] ---> e[0] ---> d[1]

点击(此处)折叠或打开

  1. int c(int *d, int *e) {
  2.         int r;
  3.         d[0] += 1;
  4.         r = e[0];
  5.         asm volatile("" ::: "memory");
  6.         d[1] += 1;
  7.         return r;
  8. }

点击(此处)折叠或打开

  1. 00000000 <c>:
  2.    0: 6802 ldr r2, [r0, #0]
  3.    2: 4603 mov r3, r0
  4.    4: 3201 adds r2, #1
  5.    6: 6002 str r2, [r0, #0]
  6.    8: 6808 ldr r0, [r1, #0]
  7.    a: 685a ldr r2, [r3, #4]
  8.    c: 3201 adds r2, #1
  9.    e: 605a str r2, [r3, #4]
  10.   10: 4770 bx lr
  11.   12: bf00 nop







阅读(1409) | 评论(0) | 转发(0) |
0

上一篇:单链表

下一篇:c++ 迭代器

给主人留下些什么吧!~~