619 字
3 分钟
信号量是什么?计数信号量和二元信号量怎么用
信号量是带原子操作的计数同步原语。等待(常称 P、wait)会在资源不可用时阻塞,资源可用时原子地消耗一个许可;释放(常称 V、post)增加许可并可能唤醒等待者。实现必须保证检查与修改计数不会被并发交错破坏。
计数信号量的计数表示可用资源数,适合限制并发访问量。例如连接池容量为 8,初始化 8 个许可,每个成功借出连接的任务等待并消耗一个许可,归还时释放一个。二元信号量常用 0/1 状态通知一个事件或表示单一许可,但它不自动具备互斥锁的所有语义。
信号量也可用于生产者消费者:空槽信号量初值为缓冲区容量,满槽信号量初值为 0。生产者先等待空槽、写入元素,再释放满槽;消费者先等待满槽、取出元素,再释放空槽。若多个生产者或消费者还会并发修改队列指针,仍需要互斥保护队列本身,不能认为两个计数器自动保护了数据结构。
信号量和互斥锁的区别
互斥锁表达“谁拥有这段临界区”,通常只有加锁者负责解锁;信号量表达“可用许可数量/事件”,释放者不一定是等待者。信号量使用不当会出现多释放、漏释放或许可与资源不一致。二元信号量可实现某些互斥,但所有权、优先级继承和调试语义可能不同,应优先使用意图匹配的互斥锁。
常见追问
Q:信号量减到 0 就一定阻塞吗?
A:更准确地说,等待操作在没有可用许可时阻塞;计数为 0 表示没有许可。不能先把计数减成负数再用“负数”作为普遍定义,具体接口和实现语义有差异。
Q:信号量会传递数据吗?
A:不会。它协调许可或事件;要传数据还需队列、共享内存或其他通信通道。
Q:生产者消费者为什么既要信号量又可能要互斥锁?
A:空槽/满槽计数保证容量和可消费数量,互斥锁保护队列结构及读写指针。两者解决的问题不同。
信号量是什么?计数信号量和二元信号量怎么用
https://blog.xqcherry.top/posts/interview/operating-system/semaphore-basics/ 目录