在 C# 中,SemaphoreSlim 和 Semaphore 这两个同步原语有哪些关键区别?
考察说明
考查对 C# 中两种信号量实现差异的理解,包括适用场景与性能特性。
回答思路
- 【回答框架 1】Semaphore 是经典的 Windows 内核信号量,跨进程同步,构造可指定最大计数,使用 WaitOne 和 Release 操作,释放时需传入释放计数。
- 【回答框架 2】SemaphoreSlim 是轻量级信号量,仅限进程内同步,基于自旋和内核等待混合实现,使用 Wait/Release 方法,支持取消令牌和异步等待。
- 【回答框架 3】主要区别:Semaphore 可跨进程同步,SemaphoreSlim 不能;SemaphoreSlim 性能更好,尤其短临界区;SemaphoreSlim 支持 Task 友好异步。
- 【回答框架 4】选择:需要跨进程时用 Semaphore,进程内且高频率短等待用 SemaphoreSlim,异步代码只能选 SemaphoreSlim。
- 【回答框架 5】注意 SemaphoreSlim 的 Release 会抛出 SemaphoreFullException,需保证释放次数不超最大计数。
- 【关键点 1】Semaphore 基于内核对象,支持跨进程同步
- 【关键点 2】SemaphoreSlim 仅限进程内,性能更优
- 【关键点 3】SemaphoreSlim 支持异步等待和取消令牌
- 【关键点 4】跨进程场景必须用 Semaphore,异步场景必须用 SemaphoreSlim
- 【易错点 1】误以为 SemaphoreSlim 可跨进程使用
- 【易错点 2】忽略 Release 次数可能引发异常
- 【易错点 3】在异步代码中误用 Semaphore 导致线程阻塞