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-19 16:36:29

C#管道技术

2009-08-19 10:25:18

C#托管资源

2009-08-13 18:13:27

C#学习经验

2009-08-27 14:44:11

C# interfac

2009-08-31 15:48:02

C# Singleto

2009-08-25 16:14:06

C#使用ADOX

2009-08-20 15:33:03

C#跳跃语句

2009-08-31 16:51:11

C# Main()方法

2009-08-27 09:27:49

C#扩展方法

2009-08-24 17:06:37

C#字符串

2009-08-28 10:31:47

C#字符ASCII码

2009-08-28 16:43:57

C#多线程学习

2009-08-27 13:45:45

C#别名指示符

2009-08-12 15:55:12

C#接口定义

2009-08-11 14:20:41

C# .NET学习经验

2009-09-04 14:30:28

C#读取BLOB数据

2009-08-24 16:02:10

C# Windows应

2009-08-24 17:34:14

C#创建XML Web

2009-08-24 15:50:23

C# 泛型C# 泛型委托

2009-09-01 13:10:39

C#读取Word
点赞
收藏

51CTO技术栈公众号