zoukankan      html  css  js  c++  java
  • 原子操作

    原子操作指的是在执行过程中不会被别的代码中断的操作
    位和整型变量原子操作依赖底层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;
    }

    实现设备只能被一个进程打开

  • 相关阅读:
    Return Largest Numbers in Arrays-freecodecamp算法题目
    Title Case a Sentence-freecodecamp算法题目
    Find the Longest Word in a String-freecodecamp算法题目
    Check for Palindromes-freecodecamp算法题目
    Factorialize a Number-freecodecamp算法题目
    Reverse a String-freecodecamp算法题目
    js拖动div
    Jquery $.ajax()方法详解
    jQuery中$.each()方法的使用
    echarts的pie图中,各区块颜色的调整
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709686.html
Copyright © 2011-2022 走看看