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;
    }

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

  • 相关阅读:
    vue之实现日历----显示农历,滚动日历监听年月改变
    vue填坑之全局引入less,scss,styl文件
    vue填坑之引入iconfont字体图标
    纯JS实现带小圆点缩略图及左右箭头的轮播图
    canvas绘制时钟
    CSS实现鼠标移入图片边框有小三角
    jquery之.outerWidth()
    CSS ::selection 选中文字效果
    LINUX下用Nginx和Node.js构建一个简单的项目(4)
    LINUX下用Nginx和Node.js构建一个简单的项目(3)
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709686.html
Copyright © 2011-2022 走看看