• 企业应用架构研究系列二十六:信号量SemaphoreSlim与Semaphore


       在进行多线程程序的开发和设计的过程中,不可避免的需要引入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

  • 相关阅读:
    洛谷 P4419 [COCI2017-2018#1] CezarL
    SpringMVC源码(1)-文件上传请求
    pytorch算力与有效性分析
    Signoff Criteria --- ocv/aocv/pocv之AOCV介绍
    大盘向好、交付企稳,金科股份中报里的关键信号
    A_A02_003 ST-LINK驱动安装
    面向对象编程(高级部分)——final关键字
    vue学习---基于vue2中的vue指令、插槽、内置组件
    SSM+校园好货APP的设计与实现 毕业设计-附源码121619
    <泛型>带你更详细的认识泛型
  • 原文地址:https://www.cnblogs.com/luking/p/16110049.html