自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C# Mutex對(duì)象學(xué)習(xí)經(jīng)驗(yàn)

開發(fā) 后端
這里介紹使用了C# Mutex對(duì)象來同步四個(gè)線程,主線程等待四個(gè)線程的結(jié)束,而這四個(gè)線程的運(yùn)行又是與兩個(gè)C# Mutex對(duì)象相關(guān)聯(lián)的。

C#語言有很多值得學(xué)習(xí)的地方,這里我們主要介紹C# Mutex對(duì)象,包括介紹控制好多個(gè)線程相互之間的聯(lián)系等方面。

如何控制好多個(gè)線程相互之間的聯(lián)系,不產(chǎn)生沖突和重復(fù),這需要用到互斥對(duì)象,即:System.Threading 命名空間中的 Mutex 類。

我們可以把Mutex看作一個(gè)出租車,乘客看作線程。乘客首先等車,然后上車,***下車。當(dāng)一個(gè)乘客在車上時(shí),其他乘客就只有等他下車以后才可以上車。而線程與C# Mutex對(duì)象的關(guān)系也正是如此,線程使用Mutex.WaitOne()方法等待C# Mutex對(duì)象被釋放,如果它等待的C# Mutex對(duì)象被釋放了,它就自動(dòng)擁有這個(gè)對(duì)象,直到它調(diào)用Mutex.ReleaseMutex()方法釋放這個(gè)對(duì)象,而在此期間,其他想要獲取這個(gè)C# Mutex對(duì)象的線程都只有等待。

下面這個(gè)例子使用了C# Mutex對(duì)象來同步四個(gè)線程,主線程等待四個(gè)線程的結(jié)束,而這四個(gè)線程的運(yùn)行又是與兩個(gè)C# Mutex對(duì)象相關(guān)聯(lián)的。

其中還用到AutoResetEvent類的對(duì)象,可以把它理解為一個(gè)信號(hào)燈。這里用它的有信號(hào)狀態(tài)來表示一個(gè)線程的結(jié)束。

  1. using System;  
  2. using System.Threading;  
  3.  
  4. namespace ThreadExample  
  5. {  
  6. public class MutexSample  
  7. {  
  8. static Mutex gM1;  
  9. static Mutex gM2;  
  10. const int ITERS = 100;  
  11. static AutoResetEvent Event1 = new AutoResetEvent(false);  
  12. static AutoResetEvent Event2 = new AutoResetEvent(false);  
  13. static AutoResetEvent Event3 = new AutoResetEvent(false);  
  14. static AutoResetEvent Event4 = new AutoResetEvent(false);  
  15.  
  16. public static void Main(String[] args)  
  17. {  
  18. Console.WriteLine("Mutex Sample ");  
  19. //創(chuàng)建一個(gè)Mutex對(duì)象,并且命名為MyMutex  
  20. gM1 = new Mutex(true,"MyMutex");  
  21. //創(chuàng)建一個(gè)未命名的Mutex 對(duì)象.  
  22. gM2 = new Mutex(true);  
  23. Console.WriteLine(" - Main Owns gM1 and gM2");  
  24.  
  25. AutoResetEvent[] evs = new AutoResetEvent[4];  
  26. evs[0] = Event1; //為后面的線程t1,t2,t3,t4定義AutoResetEvent對(duì)象  
  27. evs[1] = Event2;   
  28. evs[2] = Event3;   
  29. evs[3] = Event4;   
  30.  
  31. MutexSample tm = new MutexSample( );  
  32. Thread t1 = new Thread(new ThreadStart(tm.t1Start));  
  33. Thread t2 = new Thread(new ThreadStart(tm.t2Start));  
  34. Thread t3 = new Thread(new ThreadStart(tm.t3Start));  
  35. Thread t4 = new Thread(new ThreadStart(tm.t4Start));  
  36. t1.Start( );// 使用Mutex.WaitAll()方法等待一個(gè)Mutex數(shù)組中的對(duì)象全部被釋放  
  37. t2.Start( );// 使用Mutex.WaitOne()方法等待gM1的釋放  
  38. t3.Start( );// 使用Mutex.WaitAny()方法等待一個(gè)Mutex數(shù)組中任意一個(gè)對(duì)象被釋放  
  39. t4.Start( );// 使用Mutex.WaitOne()方法等待gM2的釋放  
  40.  
  41. Thread.Sleep(2000);  
  42. Console.WriteLine(" - Main releases gM1");  
  43. gM1.ReleaseMutex( ); //線程t2,t3結(jié)束條件滿足  
  44.  
  45. Thread.Sleep(1000);  
  46. Console.WriteLine(" - Main releases gM2");  
  47. gM2.ReleaseMutex( ); //線程t1,t4結(jié)束條件滿足  
  48.  
  49. //等待所有四個(gè)線程結(jié)束  
  50. WaitHandle.WaitAll(evs);   
  51. Console.WriteLine(" Mutex Sample");  
  52. Console.ReadLine();  
  53. }  
  54.  
  55. public void t1Start( )  
  56. {  
  57. Console.WriteLine("t1Start started, Mutex.WaitAll(Mutex[])");  
  58. Mutex[] gMs = new Mutex[2];  
  59. gMs[0] = gM1;//創(chuàng)建一個(gè)Mutex數(shù)組作為Mutex.WaitAll()方法的參數(shù)  
  60. gMs[1] = gM2;  
  61. Mutex.WaitAll(gMs);//等待gM1和gM2都被釋放  
  62. Thread.Sleep(2000);  
  63. Console.WriteLine("t1Start finished, Mutex.WaitAll(Mutex[]) satisfied");  
  64. Event1.Set( ); //線程結(jié)束,將Event1設(shè)置為有信號(hào)狀態(tài)  
  65. }  
  66. public void t2Start( )  
  67. {  
  68. Console.WriteLine("t2Start started, gM1.WaitOne( )");  
  69. gM1.WaitOne( );//等待gM1的釋放  
  70. Console.WriteLine("t2Start finished, gM1.WaitOne( ) satisfied");  
  71. Event2.Set( );//線程結(jié)束,將Event2設(shè)置為有信號(hào)狀態(tài)  
  72. }  
  73. public void t3Start( )  
  74. {  
  75. Console.WriteLine("t3Start started, Mutex.WaitAny(Mutex[])");  
  76. Mutex[] gMs = new Mutex[2];  
  77. gMs[0] = gM1;//創(chuàng)建一個(gè)Mutex數(shù)組作為Mutex.WaitAny()方法的參數(shù)  
  78. gMs[1] = gM2;  
  79. Mutex.WaitAny(gMs);//等待數(shù)組中任意一個(gè)Mutex對(duì)象被釋放  
  80. Console.WriteLine("t3Start finished, Mutex.WaitAny(Mutex[])");  
  81. Event3.Set( );//線程結(jié)束,將Event3設(shè)置為有信號(hào)狀態(tài)  
  82. }  
  83. public void t4Start( )  
  84. {  
  85. Console.WriteLine("t4Start started, gM2.WaitOne( )");  
  86. gM2.WaitOne( );//等待gM2被釋放  
  87. Console.WriteLine("t4Start finished, gM2.WaitOne( )");  
  88. Event4.Set( );//線程結(jié)束,將Event4設(shè)置為有信號(hào)狀態(tài)  
  89. }  
  90. }  

【編輯推薦】

  1. C# lock關(guān)鍵字?jǐn)⑹?/FONT>
  2. C#.Net FrameWork簡(jiǎn)介
  3. C# new和override簡(jiǎn)單描述
  4. C#值類型和引用類型淺談
  5. C#標(biāo)識(shí)符簡(jiǎn)單分析
責(zé)任編輯:佚名 來源: CSDN論壇
相關(guān)推薦

2009-08-13 18:13:27

C#學(xué)習(xí)經(jīng)驗(yàn)

2009-08-19 10:25:18

C#托管資源

2009-08-19 16:36:29

C#管道技術(shù)

2009-08-27 14:44:11

C# interfac

2009-08-25 16:14:06

C#使用ADOX

2009-08-20 15:33:03

C#跳躍語句

2009-08-31 15:48:02

C# Singleto

2009-08-24 17:06:37

C#字符串

2009-08-28 16:43:57

C#多線程學(xué)習(xí)

2009-08-27 09:27:49

C#擴(kuò)展方法

2009-08-28 10:31:47

C#字符ASCII碼

2009-08-31 16:51:11

C# Main()方法

2009-08-11 14:20:41

C# .NET學(xué)習(xí)經(jīng)驗(yàn)

2009-09-04 14:30:28

C#讀取BLOB數(shù)據(jù)

2009-08-27 13:45:45

C#別名指示符

2009-08-12 15:55:12

C#接口定義

2009-08-24 16:02:10

C# Windows應(yīng)

2009-08-24 17:34:14

C#創(chuàng)建XML Web

2009-09-01 13:10:39

C#讀取Word

2009-08-24 15:50:23

C# 泛型C# 泛型委托
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)