一個Semaphore(信號量)就像一個夜總會一樣:它有一個特定的capacity(容量),被一個保鏢強制限制。一旦它滿瞭,沒有人能再進去,然後就在外面形成瞭一個等待的Queue(隊列)。接著,一個人離開,Queue的首部的那個人進入。這種constructor(構造器)需要至少兩個參數:夜總會中目前可用的位置和夜總會的capacity。
一個帶著capacity的semaphore類似於一個Mutex(互斥量)或者lock(鎖),隻是semaphore沒有“擁有者”,換言之,它是thread(線程)不可知的。任何一個thread可以基於semaphore調用釋放,而基於Mutex和lock,隻有包含瞭lock的thread才可以釋放它。
有兩個功能相似的類:Semaphore和SemaphoreSlim。後者在Framework4.0中有介紹並且被優化,達到並行程序中的low-latency(低延時)要求。它在傳統的多線程中也很有用,因為它可以讓你在等待的時候指定一個取消記號。然而,它不能用於進程間的信號發送。
Semaphore在調用WaitOne或者Release時需要1微妙;SemaphoreSlim隻需要四分之一微秒。
Semaphore在限制並發性中很有用——防止太多的thread一起執行一個特定的代碼段。在下面的例子當中,5個thread試圖進入夜總會但是植被允許一次進入三個:
如果那個Sleep語句被代替執行集中的硬盤I/O(讀寫),Semaphore將通過限制過多並行的硬盤驅動處理活動改善執行效率。
一個Semaphore,一旦命名,則可以和一個Mutex一樣跨越進程。