SemaphoreSlim使用限制

3

文档 表示:

SemaphoreSlim 类代表一种轻量级、快速的信号量,可用于在单个进程中等待,当等待时间预计非常短时

什么是非常短的时间?有人知道明确的毫秒时间值吗?如果等待时间约为 5 分钟,是否可以使用 SemaphoreSlim 实例?


1
非瘦身信号量总是会进行操作系统内核调用。如果可能的话(无阻塞),瘦身信号量会避免这种情况。上次我测量时,该调用大约需要200纳秒。因此,当时间更短时,您将领先于其他人。当时间为毫秒或分钟时,您不会注意到差异。 - Hans Passant
1个回答

4
是否可以使用SemaphoreSlim实例,如果等待时间约为5分钟?
是的,没问题。
文档不应被理解为只有在等待时间很短的情况下才使用SemaphoreSlim。而是相对于更重量级的替代方法Semaphore更适用于这种情况。
什么是“非常短”?很难说,因为它取决于代码中发生的其他事情。但我会将其放在几十毫秒的范围内,可能长达数百毫秒。一旦你谈论秒或更长时间,我预计两者之间没有显着优势。
如果您的等待时间显着较长,则与SemaphoreSlim类相比,分配和管理Semaphore类的开销可能在执行代码的整体性能中不重要。因此,在这种情况下,即使它在技术上不太有效率,您也可以轻松地使用Semaphore
个人而言,除非我需要后者不支持的功能,否则我总是使用SemaphoreSlim而不是Semaphore。这并不经常发生,现在随着C#和.NET中更高级别的抽象,用于协调并发运行代码的可用性变得更少。即使使用信号量也变得越来越少见。

谢谢。那么,这是否意味着 Semaphore 实例可能会锁定线程的时间比所需时间更长,因此,如果预计等待时间非常短,则建议使用 SemaphoreSlim - Alexander
我没有看到“锁定”时间上的任何可衡量差异。假设您谈论的是当一个信号量被释放并且另一个正在等待它的线程获取它之间的延迟。通常,主要的瓶颈不会是同步对象,而是Windows线程调度器。一旦线程获得了锁定,它仍然不一定会立即运行。... - Peter Duniho
它被放置在“可运行”状态,然后将与任何其他线程一起获得其轮次,当操作系统线程调度程序授予线程一些CPU时间时。在这种情况下,同步对象本身的任何开销可能相对不重要。 - Peter Duniho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接