锁
:原子锁, 线程安全
1 | static int _a = 0; |
自加1
和自减1
:在GCC中提供了相应的原子指令操作,排除多线程对一个变量的操作的不可预期性。
1 | type __sync_fetch_and_add (type *ptr, type value, ...) |
原子锁与自旋锁
原子锁和自旋锁的本质相同,通过对一个变量的
自加
和自减
操作(这里的自加
、自减
都是通过一条原子指令完成),判断临界区的可操作性。
memory barrier
memory barrier有几种类型:
acquire barrier
: 不允许将barrier之后的内存读取指令移到barrier之前(linux kernel中的wmb())。release barrier
: 不允许将barrier之前的内存读取指令移到barrier之后 (linux kernel中的rmb())。full barrier
: 以上两种barrier的合集(linux kernel中的mb())。
1 | __sync_synchronize (...) |
GCC: This builtin issues a
full memory barrier
.
应用层:原子锁
1 |
|
scatom.h
示例
1 |
|
结果
g_iSum++
1
2THE SUM: 14617872
Run time: 201msATOM_INC
1
2THE SUM: 50000000
Run time: 1612msATOM_LOCK
1
2THE SUM: 50000000
Run time: 11821ms
读写锁
1 |
|
1 | // add read lock |