C# 使用Semaphore(信號量)控制多線程

使用背景

在C#.NET中,當需要動態控制線程的數量時,我們可以使用Semaphore來控制最大線程數。

 

關於Semaphore代碼示例

 class Program
 {
         //Semaphore(初始授予0個請求數,設置最大可授予5個請求數)
         static Semaphore semaphore = new Semaphore(0, 5);

         static void Main(string[] args)
         {
             for (int i = 1; i <= 5; i++)
             {
                 Thread thread = new Thread(work);
                 thread.Start(i);
             } 

             Thread.Sleep(1000);
             Console.WriteLine("Main方法結束");

             //授予5個請求
             semaphore.Release(5);
             Console.ReadLine();
         }

         static void work(object obj)
         {
             semaphore.WaitOne();
             Console.WriteLine("print: {0}", obj);
             semaphore.Release();
         }
 }

運行結果如下:

Semaphore

 new Semaphore(0, 5); 構造函數第一個參數,表示我們還可使用的授權數。 第二個參數表示我們最大可申請的授權數。

當授權數用完時,則會造成線程阻塞直到可申請到Semaphore的授權。所以如上代碼我一開始初始化了0個授權數,所以沒有授權則會被阻塞。

main方法快運行完時,我使用代碼semaphore.Release(5);授權了5個請求。 這時還阻塞在semaphore.WaitOne();的代碼得到授權則開始繼續往下運行,打印出print:{0} 。

 

小提示:semaphore.Release(); 等同於 semaphore.Release(1);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章