查看: 2046|回复: 0

[.NET源码] C#多线程中如何运用互斥锁Mutex

发表于 2018-2-8 08:00:02

互斥锁(Mutex)

互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它。

互斥锁可适用于一个共享资源每次只能被一个线程访问的情况

函数:

  1. //创建一个处于未获取状态的互斥锁
  2. Public Mutex();
  3. //如果owned为true,互斥锁的初始状态就是被主线程所获取,否则处于未获取状态
  4. Public Mutex(bool owned);
复制代码

如果要获取一个互斥锁。应调用互斥锁上的WaitOne()方法,该方法继承于Thread.WaitHandle类

它处于等到状态直至所调用互斥锁可以被获取,因此该方法将组织住主调线程直到指定的互斥锁可用,如果不需要拥有互斥锁,用ReleaseMutex方法释放,从而使互斥锁可以被另外一个线程所获取。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. namespace MyTTCon
  7. {
  8. class shareRes
  9. {
  10. public static int count = 0;
  11. public static Mutex mutex = new Mutex();
  12. }
  13. class IncThread
  14. {
  15. int number;
  16. public Thread thrd;
  17. public IncThread(string name, int n)
  18. {
  19. thrd = new Thread(this.run);
  20. number = n;
  21. thrd.Name = name;
  22. thrd.Start();
  23. }
  24. void run()
  25. {
  26. Console.WriteLine(thrd.Name + "正在等待 the mutex");
  27. //申请
  28. shareRes.mutex.WaitOne();
  29. Console.WriteLine(thrd.Name + "申请到 the mutex");
  30. do
  31. {
  32. Thread.Sleep(1000);
  33. shareRes.count++;
  34. Console.WriteLine("In " + thrd.Name + "ShareRes.count is " + shareRes.count);
  35. number--;
  36. } while (number > 0);
  37. Console.WriteLine(thrd.Name + "释放 the nmutex");
  38. // 释放
  39. shareRes.mutex.ReleaseMutex();
  40. }
  41. }
  42. class DecThread
  43. {
  44. int number;
  45. public Thread thrd;
  46. public DecThread(string name, int n)
  47. {
  48. thrd = new Thread(this.run);
  49. number = n;
  50. thrd.Name = name;
  51. thrd.Start();
  52. }
  53. void run()
  54. {
  55. Console.WriteLine(thrd.Name + "正在等待 the mutex");
  56. //申请
  57. shareRes.mutex.WaitOne();
  58. Console.WriteLine(thrd.Name + "申请到 the mutex");
  59. do
  60. {
  61. Thread.Sleep(1000);
  62. shareRes.count--;
  63. Console.WriteLine("In " + thrd.Name + "ShareRes.count is " + shareRes.count);
  64. number--;
  65. } while (number > 0);
  66. Console.WriteLine(thrd.Name + "释放 the nmutex");
  67. // 释放
  68. shareRes.mutex.ReleaseMutex();
  69. }
  70. }
  71. class Program
  72. {
  73. static void Main(string[] args)
  74. {
  75. IncThread mthrd1 = new IncThread("IncThread thread ", 5);
  76. DecThread mthrd2 = new DecThread("DecThread thread ", 5);
  77. mthrd1.thrd.Join();
  78. mthrd2.thrd.Join();
  79. }
  80. }
  81. }
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

您可能感兴趣的文章:

  • C#中lock死锁实例教程
  • C#多线程编程中的锁系统基本用法
  • C#多线程编程中的锁系统(二)
  • C#多线程编程中的锁系统(三)
  • C#多线程编程中的锁系统(四):自旋锁
  • C#检查键盘大小写锁定状态的方法
  • 如何使用C#读写锁ReaderWriterLockSlim
  • C#实现将程序锁定到Win7任务栏的方法
  • Windows中使用C#为文件夹和文件编写密码锁的示例分享
  • C#解决SQlite并发异常问题的方法(使用读写锁)


回复

使用道具 举报