在阅读环形队列的实现代码的时候,该队列只适用于one concurrent reader and one concurrent writer(单生产---单消费者模型),代码中间有个barrier函数,
实现:
-
#if defined (CONFIG_MIPS)
-
-
#define barrier() __asm__ __volatile__(".set push; .set mips4; sync; .set pop": : :"memory")
-
-
#else /* all other CPUs */
-
-
#define barrier() __asm__ __volatile ("" : : : "memory")
-
-
#endif
相信有很多像我这样菜鸟级的人不明白这是干嘛用的,查了一下资料,
引自:
creates a compiler level memory barrier forcing optimizer to not re-order memory accesses across the barrier.
创建一个编译级的内存屏障,用以阻止编译器跨越该屏障去对内存访问顺序做重新编排。简单说就是当编译器看到barrier函数时,对后面代码内存的访问顺序不做优化处理。
例如:
-
int c(int *d, int *e) {
-
int r;
-
d[0] += 1;
-
r = e[0];
-
d[1] += 1;
-
return r;
-
}
在编译器做了优化后,内存访问顺序可能是d[0] & d[1] ---> e[0];
-
00000000 <c>:
-
0: 4603 mov r3, r0
-
2: c805 ldmia r0, {r0, r2}
-
4: 3001 adds r0, #1
-
6: 3201 adds r2, #1
-
8: 6018 str r0, [r3, #0]
-
a: 6808 ldr r0, [r1, #0]
-
c: 605a str r2, [r3, #4]
-
e: 4770 bx lr
代码加了内存屏障之后,阻止了编译器对内存访问顺序做优化,访问顺序d[0] ---> e[0] ---> d[1]
-
int c(int *d, int *e) {
-
int r;
-
d[0] += 1;
-
r = e[0];
-
asm volatile("" ::: "memory");
-
d[1] += 1;
-
return r;
-
}
-
00000000 <c>:
-
0: 6802 ldr r2, [r0, #0]
-
2: 4603 mov r3, r0
-
4: 3201 adds r2, #1
-
6: 6002 str r2, [r0, #0]
-
8: 6808 ldr r0, [r1, #0]
-
a: 685a ldr r2, [r3, #4]
-
c: 3201 adds r2, #1
-
e: 605a str r2, [r3, #4]
-
10: 4770 bx lr
-
12: bf00 nop
阅读(1609) | 评论(0) | 转发(0) |