成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C# Mutex對象學習經驗

開發 后端
這里介紹使用了C# Mutex對象來同步四個線程,主線程等待四個線程的結束,而這四個線程的運行又是與兩個C# Mutex對象相關聯的。

C#語言有很多值得學習的地方,這里我們主要介紹C# Mutex對象,包括介紹控制好多個線程相互之間的聯系等方面。

如何控制好多個線程相互之間的聯系,不產生沖突和重復,這需要用到互斥對象,即:System.Threading 命名空間中的 Mutex 類。

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

下面這個例子使用了C# Mutex對象來同步四個線程,主線程等待四個線程的結束,而這四個線程的運行又是與兩個C# Mutex對象相關聯的。

其中還用到AutoResetEvent類的對象,可以把它理解為一個信號燈。這里用它的有信號狀態來表示一個線程的結束。

  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. //創建一個Mutex對象,并且命名為MyMutex  
  20. gM1 = new Mutex(true,"MyMutex");  
  21. //創建一個未命名的Mutex 對象.  
  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對象  
  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()方法等待一個Mutex數組中的對象全部被釋放  
  37. t2.Start( );// 使用Mutex.WaitOne()方法等待gM1的釋放  
  38. t3.Start( );// 使用Mutex.WaitAny()方法等待一個Mutex數組中任意一個對象被釋放  
  39. t4.Start( );// 使用Mutex.WaitOne()方法等待gM2的釋放  
  40.  
  41. Thread.Sleep(2000);  
  42. Console.WriteLine(" - Main releases gM1");  
  43. gM1.ReleaseMutex( ); //線程t2,t3結束條件滿足  
  44.  
  45. Thread.Sleep(1000);  
  46. Console.WriteLine(" - Main releases gM2");  
  47. gM2.ReleaseMutex( ); //線程t1,t4結束條件滿足  
  48.  
  49. //等待所有四個線程結束  
  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;//創建一個Mutex數組作為Mutex.WaitAll()方法的參數  
  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( ); //線程結束,將Event1設置為有信號狀態  
  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( );//線程結束,將Event2設置為有信號狀態  
  72. }  
  73. public void t3Start( )  
  74. {  
  75. Console.WriteLine("t3Start started, Mutex.WaitAny(Mutex[])");  
  76. Mutex[] gMs = new Mutex[2];  
  77. gMs[0] = gM1;//創建一個Mutex數組作為Mutex.WaitAny()方法的參數  
  78. gMs[1] = gM2;  
  79. Mutex.WaitAny(gMs);//等待數組中任意一個Mutex對象被釋放  
  80. Console.WriteLine("t3Start finished, Mutex.WaitAny(Mutex[])");  
  81. Event3.Set( );//線程結束,將Event3設置為有信號狀態  
  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( );//線程結束,將Event4設置為有信號狀態  
  89. }  
  90. }  

【編輯推薦】

  1. C# lock關鍵字敘述
  2. C#.Net FrameWork簡介
  3. C# new和override簡單描述
  4. C#值類型和引用類型淺談
  5. C#標識符簡單分析
責任編輯:佚名 來源: CSDN論壇
相關推薦

2009-08-13 18:13:27

C#學習經驗

2009-08-19 16:36:29

C#管道技術

2009-08-19 10:25:18

C#托管資源

2009-08-31 15:48:02

C# Singleto

2009-08-27 14:44:11

C# interfac

2009-08-20 15:33:03

C#跳躍語句

2009-08-25 16:14:06

C#使用ADOX

2009-08-24 17:06:37

C#字符串

2009-08-28 16:43:57

C#多線程學習

2009-08-31 16:51:11

C# Main()方法

2009-08-28 10:31:47

C#字符ASCII碼

2009-08-27 09:27:49

C#擴展方法

2009-08-12 15:55:12

C#接口定義

2009-08-27 13:45:45

C#別名指示符

2009-08-11 14:20:41

C# .NET學習經驗

2009-09-04 14:30:28

C#讀取BLOB數據

2009-08-24 17:34:14

C#創建XML Web

2009-08-24 16:02:10

C# Windows應

2009-08-24 15:50:23

C# 泛型C# 泛型委托

2009-09-01 13:10:39

C#讀取Word
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文在线视频观看 | 中文字幕在线三区 | 蜜桃精品噜噜噜成人av | 色婷婷亚洲一区二区三区 | 91在线一区二区 | 欧美国产精品一区二区三区 | 91在线视频免费观看 | 日韩精品一区二区不卡 | 特级生活片 | 国产欧美日韩在线一区 | 婷婷免费视频 | 国产精品乱码一二三区的特点 | 中文字幕韩在线第一页 | 国产视频一二三区 | 精品少妇v888av | 国产精品成人一区二区三区夜夜夜 | 日韩在线综合网 | 91资源在线播放 | 国产在线精品一区二区 | 久草网站 | 亚洲精选一区二区 | 日韩电影一区 | 久久另类视频 | 国产成人在线播放 | 中文二区| 亚洲国产成人精品久久久国产成人一区 | av黄色免费 | 色橹橹欧美在线观看视频高清 | 日韩成人免费 | 伊人精品国产 | 99精品久久 | 亚洲国产情侣 | 久久久久国产精品一区二区 | 日韩视频免费看 | 韩国成人在线视频 | 免费一级片 | 一区二区三区在线看 | 欧美一区二区三区四区五区无卡码 | a黄在线观看 | 一区二区三区回区在观看免费视频 | 亚洲精品久久久久久久久久久久久 |