信号量(Semaphore)

更多资料下载,冲击月薪过万,一线经验工程师录制, 干货满满的嵌入式视频教程,请点击淘宝店:wanglitao.taobao.com
  1. 核心原理
    信号量是一种计数型睡眠锁,允许多个线程同时持有锁(计数 > 0),计数为 0 时获取锁的线程进入睡眠。分为二元信号量(计数 = 1,等价于互斥锁)和计数信号量(计数 > 1)。

  2. 关键特性
    睡眠锁:获取失败时进程睡眠,支持多线程共享临界区。
    适用场景:进程上下文、需要控制并发访问数量的场景(如设备最大并发连接数)。
    限制:不能在中断上下文使用。

  3. 核心接口

#include <linux/semaphore.h>

// 初始化二元信号量(互斥)
struct semaphore sem;
sema_init(&sem, 1);
// 初始化计数信号量(允许n个线程并发)
sema_init(&sem, n);

// 获取锁(P操作,计数-1)
down(&sem);  // 不可中断睡眠
down_interruptible(&sem);  // 可中断睡眠,信号唤醒返回-ERESTARTSYS
// 释放锁(V操作,计数+1)
up(&sem);
驱动开发核心理论,Linux内核开发入门实战视频教程:《Linux内核编程》,具有一线芯片原厂开发经验的驱动工程师录制,详情点击:王利涛老师个人淘宝店:Linux内核编程