Linux-基本原子操作 atomic
Angie An

原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。原子类型定义如下:

1
2
3
4
5
typedef struct 
{
volatile int counter;
}
atomic_t;

volatile修饰字段告诉gcc不要对该类型的数据做优化处理,对它的访问都是对内存的访问,而不是对寄存器的访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态。

原子操作API包括:

int atomic_read(atomic_t * v);

  该函数对原子类型的变量进行原子读操作,它返回原子类型的变量v的值。


void atomic_set(atomic_t * v, int i);

  该函数设置原子类型的变量v的值为i。


void atomic_add(int i, atomic_t *v);

  该函数给原子类型的变量v增加值i。


void atomic_sub(int i, atomic_t *v);

  该函数从原子类型的变量v中减去i。


int atomic_sub_and_test(int i, atomic_t *v);

  该函数从原子类型的变量v中减去i,并判断结果是否为0,如果为0,返回真,否则返回假。


void atomic_inc(atomic_t *v);

  该函数对原子类型变量v原子地增加1


void atomic_dec(atomic_t *v);

  该函数对原子类型的变量v原子地减1


int atomic_dec_and_test(atomic_t *v);

  该函数对原子类型的变量v原子地减1,并判断结果是否为0,如果为0,返回真,否则返回假。


int atomic_inc_and_test(atomic_t *v);

  该函数对原子类型的变量v原子地增加1,并判断结果是否为0,如果为0,返回真,否则返回假。


int atomic_add_negative(int i, atomic_t *v);

  该函数对原子类型的变量v原子地增加I,并判断结果是否为负数,如果是,返回真,否则返回假。


int atomic_add_return(int i, atomic_t *v);

  该函数对原子类型的变量v原子地增加i,并且返回指向v的指针。


int atomic_sub_return(int i, atomic_t *v);

  该函数从原子类型的变量v中减去i,并且返回指向v的指针。


int atomic_inc_return(atomic_t * v);

  该函数对原子类型的变量v原子地增加1并且返回指向v的指针。


int atomic_dec_return(atomic_t * v);
  该函数对原子类型的变量v原子地减1并且返回指向v的指针。

基本操作:

宏或者函数 说明
atomic_read 返回原子变量的值
atomic_set 设置原子变量的值。
atomic_add 增加计数的值。(+i)
atomic_sub 减少计数的值。(-i)
atomic_inc 递增计数的值。(++)
atomic_dec 递减计数的值。(–)
 Comments