在并发编程中,** 锁(如互斥锁)和信号量(Semaphore)** 是两种不同的同步原语,它们的设计目的和应用场景存在本质区别。理解它们的核心差异,能帮助我们在不同场景下做出正确的选择。
1. 核心概念对比
互斥锁(Mutex)
- 目的:保证同一时间只有一个线程访问共享资源,实现互斥。
- 特性:
- 二进制状态:只有 “锁定” 和 “解锁” 两种状态。
- 同一线程获取锁后必须释放,否则其他线程会永久阻塞(死锁)。
- 典型场景:保护临界区(如修改共享变量、操作文件等)。
信号量(Semaphore)
- 目的:控制同一时间访问共享资源的最大线程数,实现限流或同步。
- 特性:
- 计数器:允许
N
个线程同时访问(初始值为N
)。 - 无需释放者与获取者为同一线程(如生产者 - 消费者模型)。
- 计数器:允许
- 典型场景: