中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

[.Net線程處理系列]專題六:線程同步——信號量和互斥體

發布時間:2020-06-28 08:32:59 來源:網絡 閱讀:928 作者:LearningHard 欄目:編程語言

也不多說了,直接進入主題了

一、信號量(Semaphore)

信號量(Semaphore)是由內核對象維護的int變量,當信號量為0時,在信號量上等待的線程會堵塞,信號量大于0時,就解除堵塞。當在一個信號量上等待的線程解除堵塞時,內核自動會將信號量的計數減1。在.net 下通過Semaphore類來實現信號量同步。

Semaphore類限制可同時訪問某一資源或資源池的線程數。線程通過調用 WaitOne方法將信號量減1,并通過調用 Release方法把信號量加1

先說下構造函數:

public Semaphore(int initialCount,int maximumCount);通過兩個參數來設置信號的初始計數和最大計數。

下面通過一段代碼來演示信號量同步的使用:

 
  1. class Program  
  2.     {  
  3.         // 初始信號量計數為0,最大計數為10  
  4.         public static Semaphore semaphore =new Semaphore(0,10);  
  5.         public static int time = 0;  
  6.         static void Main(string[] args)  
  7.         {  
  8.             for (int i = 0; i < 5; i++)  
  9.             {  
  10.                 Thread test = new Thread(new ParameterizedThreadStart(TestMethod));  
  11.  
  12.                 // 開始線程,并傳遞參數  
  13.                 test.Start(i);  
  14.             }  
  15.  
  16.             // 等待1秒讓所有線程開始并阻塞在信號量上  
  17.             Thread.Sleep(500);  
  18.  
  19.             // 信號量計數加4  
  20.             // 最后可以看到輸出結果次數為4次  
  21.             semaphore.Release(4);  
  22.             Console.Read();           
  23.         }  
  24.  
  25.         public static void TestMethod(object number)  
  26.         {  
  27.             // 設置一個時間間隔讓輸出有順序  
  28.             int span = Interlocked.Add(ref time, 100);  
  29.             Thread.Sleep(1000 + span);  
  30.  
  31.             //信號量計數減1  
  32.             semaphore.WaitOne();  
  33.               
  34.             Console.WriteLine("Thread {0} run ", number);  
  35.         }  
  36.     } 
運行結果:[.Net線程處理系列]專題六:線程同步——信號量和互斥體

 同樣信號量也可以實現進程中線程的同步,同樣也是通過對信號量命名來實現的,

通過調用public Semaphore(int initialCount,int maximumCount,string name);該構造函數多傳入一個信號量名來實現

下面一段實例代碼來演示下:

  1. using System;  
  2. using System.Threading;  
  3.  
  4. namespace SemaphoreSample  
  5. {  
  6.     class Program  
  7.     {  
  8.         // 初始信號量計數為4,最大計數為10  
  9.         public static Semaphore semaphore =new Semaphore(4,10,"My");  
  10.         public static int time = 0;  
  11.         static void Main(string[] args)  
  12.         {  
  13.             for (int i = 0; i < 3; i++)  
  14.             {  
  15.                 Thread test = new Thread(new ParameterizedThreadStart(TestMethod));  
  16.  
  17.                 // 開始線程,并傳遞參數  
  18.                 test.Start(i);  
  19.             }  
  20.  
  21.             // 等待1秒讓所有線程開始并阻塞在信號量上  
  22.             Thread.Sleep(1000);  
  23.  
  24.             Console.Read();           
  25.         }  
  26.  
  27.         public static void TestMethod(object number)  
  28.         {  
  29.             // 設置一個時間間隔讓輸出有順序  
  30.             int span = Interlocked.Add(ref time, 500);  
  31.             Thread.Sleep(1000 + span);  
  32.  
  33.             //信號量計數減1  
  34.             semaphore.WaitOne();  
  35.               
  36.             Console.WriteLine("Thread {0} run ", number);  
  37.         }  
  38.     }  
 

運行結果:[.Net線程處理系列]專題六:線程同步——信號量和互斥體

    從運行結果中可以看出, 第二個進程值運行了一行語句, 因為我們設置的初始信號計數為4,每運行一個線程,信號計數通過調用WaitOne方法減1,所以第二個進行一開始信號計數為1而不是進程一中的4,如果我們把信號計數后面的name參數去除的話,此時第二個進程和第一個進程中的結果應該是一樣的(因為此時沒有進行不同進程中線程的同步)。

二、互斥體(Mutex)

同樣互斥體也是同樣可以實現線程之間的同步和不同進程中線程的同步的

先看看線程之間的同步的例子吧(在這里我也不多做解釋了,因為他們之間的使用很類似,直接貼出代碼):

  1. class Program  
  2.     {  
  3.         public static Mutex mutex = new Mutex();  
  4.         public static int count;  
  5.  
  6.         static void Main(string[] args)  
  7.         {  
  8.             for (int i = 0; i < 10; i++)  
  9.             {  
  10.                 Thread test = new Thread(TestMethod);  
  11.  
  12.                 // 開始線程,并傳遞參數  
  13.                 test.Start();  
  14.             }  
  15.  
  16.             Console.Read();  
  17.         }  
  18.  
  19.         public static void TestMethod()  
  20.         {  
  21.             mutex.WaitOne();  
  22.             Thread.Sleep(500);  
  23.             count++;  
  24.             Console.WriteLine("Current Cout Number is {0}", count);  
  25.             mutex.ReleaseMutex();  
  26.         }  
  27.     } 
 
 

運行結果:[.Net線程處理系列]專題六:線程同步——信號量和互斥體

 實現進程間同步:

  1. class Program  
  2.     {  
  3.         public static Mutex mutex = new Mutex(false,"My");  
  4.  
  5.         static void Main(string[] args)  
  6.         {  
  7.             Thread t = new Thread(TestMethod);  
  8.             t.Start();  
  9.  
  10.             Console.Read();  
  11.         }  
  12.  
  13.         public static void TestMethod()  
  14.         {  
  15.             mutex.WaitOne();  
  16.             Thread.Sleep(5000);  
  17.             Console.WriteLine("Method start at : " + DateTime.Now.ToLongTimeString());  
  18.             mutex.ReleaseMutex();  
  19.         }  
  20.     } 
 
運行結果:[.Net線程處理系列]專題六:線程同步——信號量和互斥體

    從運行結果看出兩個進程之間的時間間隔為5秒,當我們把構造函數中命名參數去掉時就可以看出差別了。


 三、小結

    到這里多線程處理基本上講完,這個系列也只是一個入門,真真要好好掌握多線程,還是要在項目中多去實戰的。接下來我可能會做一個小的例子的,大概的思路是實現一個文件的下載的這樣的例子。如果大家有什么好的例子來運用多線程的知識的話,可以留言給我,我也會盡量去實現(如果不會的話,這樣也可以促使我去學習),實現后也會和大家分享的。

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永清县| 枣庄市| 汽车| 大安市| 嵩明县| 永平县| 建德市| 灵石县| 横峰县| 六安市| 久治县| 隆安县| 明水县| 阿克苏市| 正镶白旗| 彭阳县| 砚山县| 饶河县| 微博| 乐平市| 庆阳市| 肇州县| 金秀| 永吉县| 桦甸市| 北川| 云龙县| 定州市| 正蓝旗| 融水| 朝阳县| 广东省| 邹城市| 万年县| 横峰县| 丰台区| 普安县| 呼玛县| 合川市| 海林市| 康定县|