自旋锁(spinlock)

更多资料下载,冲击月薪过万,一线经验工程师录制, 干货满满的嵌入式视频教程,请点击淘宝店:wanglitao.taobao.com

Linux 内核作为多任务、多处理器(SMP)环境下的核心,并发控制机制是保障内核数据结构完整性、避免竞态(Race Condition)的关键。内核中的并发来源主要包括:多 CPU 并发执行、抢占式调度、中断与进程上下文的切换。以下是内核中主流的并发控制机制,按适用场景和粒度分类详解:

  1. 核心原理
    自旋锁是一种忙等锁,当线程获取锁失败时,不会进入睡眠,而是循环检测锁是否被释放(自旋)。适用于临界区执行时间极短的场景,避免了进程切换的开销。

  2. 关键特性
    非睡眠锁:持有自旋锁期间,内核禁止抢占(单 CPU),禁止其他 CPU 访问临界区(SMP)。
    不可递归:同一线程不能重复获取同一个自旋锁,会导致死锁。
    适用场景:SMP 架构、中断上下文(不能睡眠的场景)、临界区代码短。

  3. 核心接口

#include <linux/spinlock.h>

// 定义并初始化自旋锁
spinlock_t lock = __SPIN_LOCK_UNLOCKED(lock);
// 动态初始化
spin_lock_init(&lock);

// 获取锁(禁止抢占)
spin_lock(&lock);
// 获取锁(不禁止抢占,需手动禁止)
spin_lock_nested(&lock, subclass);
// 释放锁
spin_unlock(&lock);

// 中断上下文专用(禁止本地中断)
spin_lock_irqsave(&lock, flags);  // 保存中断状态
spin_unlock_irqrestore(&lock, flags);  // 恢复中断状态
  1. 衍生类型
    读写自旋锁(rwlock_t):区分读操作(共享)和写操作(独占),读多写少场景下提升并发效率。
    rwlock_t rw_lock = __RW_LOCK_UNLOCKED(rw_lock);
    read_lock(&rw_lock);   // 读获取
    write_lock(&rw_lock);  // 写获取
    
驱动开发核心理论,Linux内核开发入门实战视频教程:《Linux内核编程》,具有一线芯片原厂开发经验的驱动工程师录制,详情点击:王利涛老师个人淘宝店:Linux内核编程