这里介绍使用了C# Mutex对象来同步四个线程,主线程等待四个线程的结束,而这四个线程的运行又是与两个C# Mutex对象相关联的。

C#言语有许多值得学习的当地,这儿咱们首要介绍C# Mutex目标,包含介绍操控好多个线程相互之间的联络等方面。

C# Mutex目标学习经历  Mutex对象 第1张

怎么操控好多个线程相互之间的联络,不发生抵触和重复,这需求用到互斥目标,即:System.Threading 命名空间中的 Mutex 类。

咱们能够把Mutex看作一个出租车,乘客看作线程。乘客首要等车,然后上车,***下车。当一个乘客在车上时,其他乘客就只要等他下车今后才能够上车。而线程与C# Mutex目标的联系也正是如此,线程运用Mutex.WaitOne()办法等候C# Mutex目标被开释,假如它等候的C# Mutex目标被开释了,它就主动具有这个目标,直到它调用Mutex.ReleaseMutex()办法开释这个目标,而在此期间,其他想要获取这个C# Mutex目标的线程都只要等候。

下面这个比如运用了C# Mutex目标来同步四个线程,主线程等候四个线程的完毕,而这四个线程的运转又是与两个C# Mutex目标相关联的。

其间还用到AutoResetEvent类的目标,能够把它理解为一个信号灯。这儿用它的有信号状况来表明一个线程的完毕。

  1. usingSystem;
  2. usingSystem.Threading;
  3. namespaceThreadExample
  4. {
  5. publicclassMutexSample
  6. {
  7. staticMutexgM1;
  8. staticMutexgM2;
  9. constintITERS=100;
  10. staticAutoResetEventEvent1=newAutoResetEvent(false);
  11. staticAutoResetEventEvent2=newAutoResetEvent(false);
  12. staticAutoResetEventEvent3=newAutoResetEvent(false);
  13. staticAutoResetEventEvent4=newAutoResetEvent(false);
  14. publicstaticvoidMain(String[]args)
  15. {
  16. Console.WriteLine("MutexSample");
  17. //创立一个Mutex目标,而且命名为MyMutex
  18. gM1=newMutex(true,"MyMutex");
  19. //创立一个未命名的Mutex目标.
  20. gM2=newMutex(true);
  21. Console.WriteLine("-MainOwnsgM1andgM2");
  22. AutoResetEvent[]evs=newAutoResetEvent[4];
  23. evs[0]=Event1;//为后边的线程t1,t2,t3,t4界说AutoResetEvent目标
  24. evs[1]=Event2;
  25. evs[2]=Event3;
  26. evs[3]=Event4;
  27. MutexSampletm=newMutexSample();
  28. Threadt1=newThread(newThreadStart(tm.t1Start));
  29. Threadt2=newThread(newThreadStart(tm.t2Start));
  30. Threadt3=newThread(newThreadStart(tm.t3Start));
  31. Threadt4=newThread(newThreadStart(tm.t4Start));
  32. t1.Start();//运用Mutex.WaitAll()办法等候一个Mutex数组中的目标悉数被开释
  33. t2.Start();//运用Mutex.WaitOne()办法等候gM1的开释
  34. t3.Start();//运用Mutex.WaitAny()办法等候一个Mutex数组中恣意一个目标被开释
  35. t4.Start();//运用Mutex.WaitOne()办法等候gM2的开释
  36. Thread.Sleep(2000);
  37. Console.WriteLine("-MainreleasesgM1");
  38. gM1.ReleaseMutex();//线程t2,t3完毕条件满意
  39. Thread.Sleep(1000);
  40. Console.WriteLine("-MainreleasesgM2");
  41. gM2.ReleaseMutex();//线程t1,t4完毕条件满意
  42. //等候一切四个线程完毕
  43. WaitHandle.WaitAll(evs);
  44. Console.WriteLine("MutexSample");
  45. Console.ReadLine();
  46. }
  47. publicvoidt1Start()
  48. {
  49. Console.WriteLine("t1Startstarted,Mutex.WaitAll(Mutex[])");
  50. Mutex[]gMs=newMutex[2];
  51. gMs[0]=gM1;//创立一个Mutex数组作为Mutex.WaitAll()办法的参数
  52. gMs[1]=gM2;
  53. Mutex.WaitAll(gMs);//等候gM1和gM2都被开释
  54. Thread.Sleep(2000);
  55. Console.WriteLine("t1Startfinished,Mutex.WaitAll(Mutex[])satisfied");
  56. Event1.Set();//线程完毕,将Event1设置为有信号状况
  57. }
  58. publicvoidt2Start()
  59. {
  60. Console.WriteLine("t2Startstarted,gM1.WaitOne()");
  61. gM1.WaitOne();//等候gM1的开释
  62. Console.WriteLine("t2Startfinished,gM1.WaitOne()satisfied");
  63. Event2.Set();//线程完毕,将Event2设置为有信号状况
  64. }
  65. publicvoidt3Start()
  66. {
  67. Console.WriteLine("t3Startstarted,Mutex.WaitAny(Mutex[])");
  68. Mutex[]gMs=newMutex[2];
  69. gMs[0]=gM1;//创立一个Mutex数组作为Mutex.WaitAny()办法的参数
  70. gMs[1]=gM2;
  71. Mutex.WaitAny(gMs);//等候数组中恣意一个Mutex目标被开释
  72. Console.WriteLine("t3Startfinished,Mutex.WaitAny(Mutex[])");
  73. Event3.Set();//线程完毕,将Event3设置为有信号状况
  74. }
  75. publicvoidt4Start()
  76. {
  77. Console.WriteLine("t4Startstarted,gM2.WaitOne()");
  78. gM2.WaitOne();//等候gM2被开释
  79. Console.WriteLine("t4Startfinished,gM2.WaitOne()");
  80. Event4.Set();//线程完毕,将Event4设置为有信号状况
  81. }
  82. }
  83. }

【修改引荐】

  1. C# lock关键字叙说
  2. C#.Net FrameWork简介
  3. C# new和override简略描绘
  4. C#值类型和引证类型浅谈
  5. C#标识符简略剖析
转载请说明出处
知优网 » C# Mutex目标学习经历

发表评论

您需要后才能发表评论