SemaphoreSlim 基于 SpinWait 和 Monitor,因此等待获取锁的线程会消耗 CPU 周期一段时间,希望在向另一个线程屈服之前获取锁。如果没有发生这种情况,那么线程将允许系统切换上下文,并在操作系统再次调度该线程时再次尝试(通过消耗一些 CPU 周期)。经过长时间的等待,这种模式可能会耗费大量的 CPU 周期。因此,这种实现的最佳情况是,大多数时候没有等待时间,您几乎可以立即获得锁。
信号量依赖于操作系统内核中的实现,因此每次获取锁时,都会花费相当多的 CPU 周期,但在此之后,线程只需要睡眠足够长的时间就可以获取锁。