|
沙发

楼主 |
发表于 2009-10-26 00:23:02
|
只看该作者
原子操作
原子操作是指在执行过程中不会被别的代码路径所中断的操作。
Linux 内核提供了一系列函数来实现内核中的原子操作,这些函数分为两类:位原子操作和整形变量原子操作。这两种操作在任何情况下都是原子性的,内核代码可以安全地调用它们而不会被打断,它们都依赖于底层 CPU 的原子操作实现,因此所有这些函数与 CPU 架构密切想关。
为了处理原子操作,Linux 内核提供了一种特殊类型 : atomic_t ,它的定义是( 一个以原子性访问的计数器 ):
typedef struct {
volatile int counter;
} atomic_t;
整型原子操作:
1、设置原子变量的值atomic_t v = ATOMIC_INIT(0); /*定义原子变量 v 并初始化为 0*/
void atomic_set (atomic_t *v, int i); /*设置 *v 为 i*/
2、获取原子变量的值atomic_read (atomic_t *v); /*返回 *v 的值*/
3、原子变量加/减void atomic_add (atomic_t *v);
void atomic_sub (atomic_t *v);
4、原子变量自增/自减void atomic_inc (atomic_t *v); /* *v 加 1*/
void atomic_dec (atomic_t *v) /* *v 减 1*/
5、操作并测试int atomic_inc_and_test (atomic_t *v);
int atomic_dec_and_test (atomic_t *v);
int atomic_sub_and_test (atomic_t *v);
上述操作对原子变量执行自增、自减和减操作后(注意没有加),测试其是否为 0 ,为 0 则返回 true ,否则返回 false 。
6、操作并返回
int atomic_add_returen (int i, atomic_t *v);
int atomic_sub_returen (int i, atomic_t *v);
int atomic_inc_returen (int i, atomic_t *v);
int atomic_dec_returen (int i, atomic_t *v);
上述操作对原子变量进行加/减 和 自增/自减操作,并返回新值。
位原子操作
1、设置位
void set_bit (nr, void *addr);
addr 地址的第 nr 位,置位即将位写为1。
2、清除位
void clear_bit (nr, void *addr);
清除地址 addr 上的第 nr 位,即对其位写0。
3、改变位
void change_bit (nr, void *addr);
对 addr 上的第 nr 进行反置。
4、测试位
test_bit (nr, void *addr);
返回 addr 地址上的第 nr 位。
5、测试并操作位
int test_and_set_bit (nr, void *addr);
int test_and_clear_bit (nr, void *addr);
int test_and_change_bit (nr, void *addr); |
|