您的位置:首页 > 运维架构 > Linux

linux的原子操作学习总结

2016-11-15 17:35 417 查看
原子操作是指在执行中不会被其他代码路径所中断的操作

⑴整型原子操作

1.设置原子变量的值

void atomic_set(atomic_t
*v, int i); /*
设置原子变量的值为 i
*/

atomic_t v = ATOMIC_INIT(0); /*
定义原子变量 v 并初始化为
0 */
2.获取原子变量的值

atomic_read(atomic_t
*v); /*
返回原子变量的值*/
3.原子变量加/减

void atomic_add(int i, atomic_t
*v); /*
原子变量增加 i */

void atomic_sub(int i, atomic_t
*v); /*
原子变量减少 i */
4.原子变量自增/自减

void atomic_inc(atomic_t
*v); /*
原子变量增加 1 */

void atomic_dec(atomic_t
*v); /*
原子变量减少 1 */
5.操作并测试
int atomic_inc_and_test(atonic_t *v);

int atomic_dec_and_test(atomic_t
*v);

int atomic_sub_and_test(int i, atomic_t
*v);

上述操作对原子变量执行自增、自减和减操作后(注意没有加)测试其是否为
0,为 0
返回
true,否则返回
false。
6.操作并返回

int atomic_add_return(int i, atomic_t
*v);

int atomic_sub_return(int i, atomic_t
*v);

int atomic_inc_return(atomic_t
*v);

int atomic_dec_return(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);
原子操作程序模版

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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息