天天看点

原子操作

原子操作指的是在执行过程中不会被别的代码中断的操作

位和整型变量原子操作依赖底层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;
}