atomic_spinlock_semaphore_mutex

linux kernel 避免共享资源冲突的方法有4种,如原子操作、自旋锁、信号量和互斥体。

  • 原子操作

    atomic_t atomic = ATOMIC_INIT(0); // 定义与初始化, atomic=0
    
    atomic_set(&atomic, 20);          // 相当于 atomic=20
    atomic_inc(&atomic);              // 相当于 atomic+=1, 21
    pr_debug("%s: test == %d\n", __func__, atomic_read(&atomic));
  • 自旋锁

    如果得不到自旋锁,进程不能进入睡眠状态,一直在原地等待

    DEFINE_SPINLOCK(spinlock); // 定义与初始化
    
    unsigned long flags;
    spin_lock_irqsave(&spinlock, flags);
    pr_debug("%s: spinlock function\n", __func__); // can not sleep
    spin_unlock_irqrestore(&spinlock, flags);
  • 信号量

    如果得不到信号量,进程进入睡眠状态,等待唤醒

    struct semaphore sem; // 定义
    
    sema_init(&sem, 10);  // 初始化, 信号量有10个,即同时允许10个进程访问共享资源
    down(&sem);           // 信号量减一
    pr_debug("%s: semaphore function\n", __func__); // can sleep
    up(&sem);             // 信号量加一
  • 互斥体

    如果得不到互斥体,进程进入睡眠状态,等待唤醒

    注意:互斥体与信号量为1时,效果是一样的

    DEFINE_MUTEX(mutexlock); // 定义与初始化
    
    mutex_lock(&mutexlock);
    pr_debug("%s: mutexlock function\n", __func__); // can sleep
    mutex_unlock(&mutexlock);

Last updated

Was this helpful?