Semaphore是System.Threading下的類,限制可同時訪問某一資源或資源池的線程數。
常用構造方法
https://msdn.microsoft.com/zh-cn/library/e1hct27h(v=vs.110).aspx
public Semaphore( int initialCount, int maximumCount )
參數
- initialCount
-
Type:
System.Int32
可以同時授予的信號量的初始請求數。
- maximumCount
-
Type:
System.Int32
可以同時授予的信號量的最大請求數。
示例代碼
class Program { static Semaphore sema = new Semaphore(1,1); static void Main(string[] args) { for (int i = 0; i < 3; i++) { var thread = new Thread(Test) { Name = $"Thread{ i }" }; thread.Start(); } Console.ReadKey(); } static void Test() { sema.WaitOne(); for (int i = 0; i < 3; i++) { Console.WriteLine($"ThreadName:{ Thread.CurrentThread.Name} i:{i}"); Thread.Sleep(1000); } sema.Release(); Console.ReadKey(); } }
代碼說明:
static Semaphore sema = new Semaphore(1,1);
聲明一個信號量,指示控制的資源初始和最大線程並發數為1
sema.WaitOne();
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"ThreadName:{ Thread.CurrentThread.Name} i:{i}");
Thread.Sleep(1000);
}
sema.Release();
使用以上兩個方法控制資源,某個線程執行sema.WaitOne()方法時,若有其他線程已經占用資源,此方法將阻塞,直到,其他線程釋放,即調用sema.Release();方法
執行效果如下:
同一段時間內,只有一個線程進入共享資源中。

以下是最大並發數為2的執行效果:
static Semaphore sema = new Semaphore(2,2);
同一段時間內,有兩個線程進入了貢獻資源中

