C#面试题更新 2026-08-05

在 C# 中,SemaphoreSlim 和 Semaphore 这两个同步原语有哪些关键区别?

技术原理技术选型方案权衡C#

考察说明

考查对 C# 中两种信号量实现差异的理解,包括适用场景与性能特性。

回答思路

  1. 【回答框架 1】Semaphore 是经典的 Windows 内核信号量,跨进程同步,构造可指定最大计数,使用 WaitOne 和 Release 操作,释放时需传入释放计数。
  2. 【回答框架 2】SemaphoreSlim 是轻量级信号量,仅限进程内同步,基于自旋和内核等待混合实现,使用 Wait/Release 方法,支持取消令牌和异步等待。
  3. 【回答框架 3】主要区别:Semaphore 可跨进程同步,SemaphoreSlim 不能;SemaphoreSlim 性能更好,尤其短临界区;SemaphoreSlim 支持 Task 友好异步。
  4. 【回答框架 4】选择:需要跨进程时用 Semaphore,进程内且高频率短等待用 SemaphoreSlim,异步代码只能选 SemaphoreSlim。
  5. 【回答框架 5】注意 SemaphoreSlim 的 Release 会抛出 SemaphoreFullException,需保证释放次数不超最大计数。
  6. 【关键点 1】Semaphore 基于内核对象,支持跨进程同步
  7. 【关键点 2】SemaphoreSlim 仅限进程内,性能更优
  8. 【关键点 3】SemaphoreSlim 支持异步等待和取消令牌
  9. 【关键点 4】跨进程场景必须用 Semaphore,异步场景必须用 SemaphoreSlim
  10. 【易错点 1】误以为 SemaphoreSlim 可跨进程使用
  11. 【易错点 2】忽略 Release 次数可能引发异常
  12. 【易错点 3】在异步代码中误用 Semaphore 导致线程阻塞