在 C# 中,Mutex 和 Semaphore 都属于同步原语,它们在工作机制上有何不同?请说明各自适用的典型业务场景。
考察说明
考查对 C# 并发同步原语 Mutex 与 Semaphore 的核心差异及典型应用场景的理解。
回答思路
- 【回答框架 1】Mutex 是互斥锁,同一时刻只允许一个线程或进程访问共享资源;Semaphore 是信号量,维护一个计数器,允许多个线程或进程同时访问,数量受初始计数限制。
- 【回答框架 2】Mutex 与 Semaphore 的计数模型不同:Mutex 计数为 1,本质是二值信号量;Semaphore 可设置为任意非负整数,用于控制并发访问数量。
- 【回答框架 3】Mutex 支持线程所有权和递归获取,同一线程可重复获得而不会死锁;Semaphore 不区分所有者,通常不能递归获取,释放时需对应一次获取。
- 【回答框架 4】Mutex 可用于跨进程同步,命名 Mutex 可跨进程互斥;Semaphore 也可跨进程,但更常用于同一进程内限制并发线程数,如连接池或任务队列。
- 【回答框架 5】典型场景:Mutex 保护全局资源或跨进程临界区,如单实例应用锁;Semaphore 限制数据库连接数、文件并发访问或固定线程池容量。
- 【关键点 1】Mutex 是互斥锁,计数为 1,支持线程所有权和递归获取。
- 【关键点 2】Semaphore 是计数信号量,允许指定数量并发访问,不跟踪所有者。
- 【关键点 3】Mutex 常用于跨进程互斥和资源独占;Semaphore 用于限流和控制并发数量。
- 【易错点 1】不要混淆 Mutex 与 lock 语句,lock 仅进程内线程互斥,Mutex 可跨进程但开销更大。
- 【易错点 2】使用 Semaphore 时需确保每次获取都对应释放,否则计数泄漏导致死锁。
- 【易错点 3】Mutex 的递归获取是特性而非绝对优势,滥用会导致逻辑复杂且性能下降。