在进行多线程程序的开发和设计的过程中,不可避免的需要引入semaphore信号量这个组件,这是.net框架提供的一个对多线程计数互斥的方案,就是允许指定的线程个数访问特定的资源而增加的 一个“红绿灯”,只有获取了semaphore的信号后,才能进入特定的资源。那么从netcore 后,又引入了semaphoreslim这个工具类,它与semaphore 有什么区别呢?网上搜搜后,发现它们两个区别大概是一个是通过windows 内核kernal提供的,一个是.net运行时提供的。网上信息不是都是准确的,最好还是去官网确认一下。

  

  经过官网确认的确是semaphoreSlim 是一个轻量级的信号量,不依赖于windows kernel semaphore。经过分析,明白,netcore 是一个跨平台的开发框架,进行多线程开发的时候,我们也要考虑平台的依赖,否则就有可能会陷入一个技术坑。

  明白了semaphore 与semaphoreSlim的区别,再做一个小Demo进行测试练习一下。官方文档有一个测试代码,稍加改造运行了一下测试了一下,打印出了运行结果。

  

  运行结果分析,创建了一个允许0~3个线程的信号量的SemaphoreSlim 实例,同时运行了5个Task,即5个线程,只有semaphore.Wait()进行了阻塞,最大允许3个线程进入,其它线程一直处于等待,当进入的线程semaphore.Release()后,一下进程才可以进入,保障当前程序访问该资源的个数。应用的场景也是非常多的,我记得之前做过了一个流程引擎,就是设置了一个信号量,保障资源的稳定输出,如果不加限制的对资源的过度调用,往往会造成了服务系统的宕机或资源耗尽。

  本文章参考官方文档:https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphoreslim?view=net-6.0

作者:|温森特|,原文链接: https://www.cnblogs.com/luking/p/16110049.html

文章推荐

聊聊OOP中的设计原则以及访问者模式

Python数据分析--Numpy常用函数介绍(5)--Numpy中的相关性函...

手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生...

linux挂载新硬盘并进行分区格式化

【js奇妙说】如何跟非计算机从业者解释,为什么浮点数计算0....

k8s client-go源码分析 informer源码分析(4)-DeltaFIFO源码...

【算法】链表的基本操作和高频算法题

一文详解 WebSocket 网络协议

netty系列之:netty对marshalling的支持

手写 Promise

知识汇总:python办公自动化应该学习哪些内容

HarmonyOS初探07——使用DevEco Studio预览器