原子操作即不能被打断的操作,应用层的概念一样,
本质就是一个变量,只能用内核的函数去加减等操作,并且操作的时候不会被中断等打断
整形原子操作
//asm/atomic.h
//创建并初始化原子变量
atomic_t tv = ATOMIC_INIT(初值);
//读原子变量
int atomic_read(atomic_t *v);
//写原子变量
void atomic_set(atomic_t *v, int i);
/**
*atomic_dec_and_test - 尝试将原子变量-1
*v:如果-1之后原子变量变为0,返回非0, 否则返回0
*/
int atomic_dec_and_test(volatile atomic_t *v);
int atomic_inc_and_test(volatile atomic_t *v);
int atomic_sub_and_test(int i, volatile atomic_t *v);
//操作并返回
int atomic_add_return(int i, atomic *v);
int atomic_sub_return(int i, atomic *v);
int atomic_inc_return(atomic *v);
int atomic_dev_return(atomic *v);
示例
static atomic_t tv;
static int demo_open(struct inode *inode, struct file *filp)
{
if(!atomic_dec_and_test(&tv)){
atomic_inc(&tv);
return -EBUSY;
}
/* 操作代码 */
return 0;
}
static int demo_release(struct inode *inode, struct file *filp)
{
atomic_inc(&tv);
return 0;
}
static int __init demo_init(void)
{
// init atomic_t
atomic_set(&tv, 1);
}
位原子操作
位原子操作即原子的位操作,内核中大量使用"位"来记录信息,比如位图,这些操作都必须是原子性的
//设置位
void set_bit(nr,void *addr);
//清除位
void clear_bit(nr,void *addr);
//改变位
void change_bit(nr,void *addr);
//测试位
test_bit(nr, void *addr);
//测试并操作位
int test_and_set_bit(nr, void *addr);
int test_and_clear_bit(nr,void *addr);