企業應用架構研究系列二十六:信號量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()後,一下進程才可以進入,保障當前程序訪問該資源的個數。應用的場景也是非常多的,我記得之前做過了一個流程引擎,就是設置了一個信號量,保障資源的穩定輸出,如果不加限制的對資源的過度調用,往往會造成了服務系統的宕機或資源耗盡。
本文章參考官方文檔://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphoreslim?view=net-6.0