企業應用架構研究系列二十六:訊號量SemaphoreSlim與Semaphore

溫森特發表於2022-05-25

   在進行多執行緒程式的開發和設計的過程中,不可避免的需要引入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

相關文章