06-位原子操作
7.3.2 位原子操作
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);
上述test_and_xxx_bit(nr, void addr)操作等同于执行test_bit(nr, void addr)后再执行xxx_bit(nr, void *addr)。
代码清单7.1给出了原子变量的使用例子,它用于使得设备最多只能被一个进程打开。
代码清单7.1 使用原子变量实现设备只能被一个进程打开
1 static atomic_t xxx_available = ATOMIC_INIT(1); /定义原子变量/
2
3 static int xxx_open(struct inode inode, struct file filp)
4 {
5 ...
6 if (!atomic_dec_and_test(&xxx_available)) {
7 atomic_inc(&xxx_available);
8 return - EBUSY; /已经打开/
9 }
10 ...
11 return 0; / 成功 /
12 }
13
14 static int xxx_release(struct inode inode, struct file filp)
15 {
16 atomic_inc(&xxx_available); / 释放设备 /
17 return 0;
18 }