原子操作
原子操作指的是在执行过程中不会被别的代码中断的操作
位和整型变量原子操作依赖底层CPU的原子操作来实现,因此所有这些函数都与CPU架构密切相关
整型原子操作
定义
typedef struct {
int counter;
} atomic_t;
init
#define ATOMIC_INIT(i) { (i) }
设置原子变量值
#define atomic_set(v,i) (((v)->counter) = (i))
获取原子变量值
#define atomic_read(v) __raw_uncached_fetch_asm(&(v)->counter)
原子变量加减
static inline void atomic_add(int i, atomic_t *v)
static inline void atomic_sub(int i, atomic_t *v)
原子变量自增/自减
#define atomic_inc(v) atomic_add(1, v)
#define atomic_dec(v) atomic_sub(1, v)
操作并测试
#define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0)
#define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0)
#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
操作并返回
static inline int atomic_add_return(int i, atomic_t *v)
static inline int atomic_sub_return(int i, atomic_t *v)
#define atomic_inc_return(v) (atomic_add_return(1, v))
#define atomic_dec_return(v) (atomic_sub_return(1, v))
位原子操作
设置位
#define set_bit(nr,p) ATOMIC_BITOP_BE(set_bit,nr,p)
清除位
#define clear_bit(nr,p) ATOMIC_BITOP_BE(clear_bit,nr,p)
改变位
#define change_bit(nr,p) ATOMIC_BITOP_BE(change_bit,nr,p)
测试并操作位
#define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p)
#define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p)
#define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p)
举例
static atomic_t atomic = ATOMIC_INIT(1);
static int open(struct inode *inode, struct file *filp)
{
...
if(!atomic_dec_and_test(&atomic ))
{
atomic_inc(&atomic);
return -EBUSY;
}
...
return 0;
}
static int release(struct inode *inode, struct file *filp)
{
atomic_inc(&atomic);
return 0;
}
实现设备只能被一个进程打开