当前位置:嗨网首页>书籍在线阅读

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 }