• 企业应用架构研究系列二十六:信号量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

  • 相关阅读:
    java中do、dto、vo、po的区别?
    MYSQL误删数据恢复
    adb shell getprop 获取系统属性
    GP09|公司赚的多,股票涨的好?
    微信小程序开发15 KISS:怎么设计简单易用的云开发函数?
    辅助驾驶功能开发-功能算法篇(1)-AEB-自车轨迹预测
    【DL with Pytorch】第 4 章 : 卷积神经网络
    Mockito(mockito-inline ^3.4.0) mockStatic 模拟无参、有参静态方法调用
    2022阿里云栖大会,顶尖科技趋势峰会和全链路元宇宙体验
    Windows消息种类
  • 原文地址:https://www.cnblogs.com/luking/p/16110049.html