我如何selectSemaphore和SemaphoreSlim?

他们的公共接口看起来类似 该文档指出,SemaphoreSlim是一个轻量级的替代品,不使用Windows内核信号量。 这个资源指出SemaphoreSlim要快得多。 在什么情况下,SemaphoreSlim对Semaphore更有意义,反之亦然?

一个区别是SemaphoreSlim不允许命名信号量,它可以是系统范围的。 这意味着SemaphoreSlim不能用于跨进程同步。

MSDN文档还指出,当“等待时间很短”时应该使用SemSlim。 这通常会很好地吻合这个想法,即在大多数折衷scheme中,超薄版本更加轻量。

MSDN文档描述了差异。

在一句话中:

  • SemaphoreSlim类表示一个轻量级,快速的信号量,当等待时间很短时,可用于在一个进程中等待。

关于“短时间”的争议:

至lessSemaphoreSlim MSDN文档指出

SemaphoreSlim类是单个应用程序中用于同步的推荐信号量。

在备注部分。 同一部分也讲述了Semaphore和SemaphoreSlim之间的主要区别:

SemaphoreSlim是不使用Windows内核信号量的Semaphore类的轻量级替代品。 与Semaphore类不同,SemaphoreSlim类不支持命名系统信号量。 您只能将其用作本地信号量。

SemaphoreSlim是基于SpinWait和Monitor,所以等待获取锁的线程正在燃烧CPU周期一段时间,希望获得锁之前,让步到另一个线程。 如果没有发生,那么一旦操作系统再次调度该线程,这些线程让系统切换上下文并再次尝试(通过燃烧一些CPU周期)。 经过长时间的等待,这种模式可以消耗大量的CPU周期。 所以这种实施的野兽情况下,大多数时候没有等待时间,你几乎可以立即获得锁。

信号量依赖于OS内核的实现,所以每次获取锁时,都会花费相当多的CPU周期,但是之后线程只需要hibernate一段时间就可以获得锁。