首页 > 技术文章 > 重新学C#编程164-Mutex:(互斥锁)线程同步

fishingsriver 2021-07-05 15:17 原文

C#中 Mutex 类也是用于线程同步操作的类,例如,当多个线程同时访问一个资源时保证一次只能有一个线程访问资源。

在 Mutex 类中,WaitOne() 方法用于等待资源被释放, ReleaseMutex() 方法用于释放资源。

WaitOne() 方法在等待 ReleaseMutex() 方法执行后才会结束。

做一个练习,使用线程互斥实现每个车位每次只能停一辆车的功能。

完整代码如下:

using System;
using System.Threading;
namespace Mutex_互斥锁线程同步练习
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Mutex互斥锁线程同步练习");
      ParameterizedThreadStart ParameterizedThreadStart1 = new ParameterizedThreadStart(PackingSpace);
      Thread thread1 = new Thread(ParameterizedThreadStart1);
      thread1.Start("京A12345");

      ParameterizedThreadStart parameterizedThreadStart2 = new ParameterizedThreadStart(PackingSpace);
      Thread thread2 = new Thread(parameterizedThreadStart2);
      thread2.Start("京A54321");
    }
    public static Mutex mutex = new Mutex();
    public static void PackingSpace(object licenseNum)
    {
      if(mutex.WaitOne())
      {
        try
        {
          Console.WriteLine("车牌号为{0}进入停车位", licenseNum);
          Thread.Sleep(1000);//等待释放
        }
        finally
        {
          Console.WriteLine("车牌号{0}离开停车位", licenseNum);
          mutex.ReleaseMutex();//释放
        }
      }

    }
  }
}

 

运行结果为

thread1 和thread2调用同样的线程,不能同时执行,在线程PackingSpace中使用WaitOne和ReleaseMutex进行等待释放和释放操作,形成互斥锁,避免了同时操作。当一个线程占用资源时,其他线程是不使用该资源的。

推荐阅读