信号量(Semaphore)
更多资料下载,冲击月薪过万,一线经验工程师录制,
干货满满的嵌入式视频教程,请点击淘宝店:wanglitao.taobao.com
核心原理
信号量是一种计数型睡眠锁,允许多个线程同时持有锁(计数 > 0),计数为 0 时获取锁的线程进入睡眠。分为二元信号量(计数 = 1,等价于互斥锁)和计数信号量(计数 > 1)。关键特性
睡眠锁:获取失败时进程睡眠,支持多线程共享临界区。
适用场景:进程上下文、需要控制并发访问数量的场景(如设备最大并发连接数)。
限制:不能在中断上下文使用。核心接口
#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内核编程