c#互斥锁Mutex类用法介绍
什么是互斥锁?
在多线程编程中,为了防止多个线程同时访问共享资源导致数据混乱的问题,需要用到互斥锁。互斥锁是一种同步方式,它保证在同一时间只有一个线程可以访问共享资源。
Mutex类的用法
在C#中,可以通过Mutex类实现互斥锁。使用Mutex类的步骤如下:
- 创建一个Mutex对象,可以通过Mutex类的构造函数来创建:
Mutex mutex = new Mutex();
- 在需要访问共享资源的代码块中调用Mutex对象的WaitOne()方法来获取锁,访问完成后调用ReleaseMutex()方法来释放锁:
mutex.WaitOne(); // 获取锁
// 访问共享资源的代码块
mutex.ReleaseMutex(); // 释放锁
示例一
在下面的示例中,我们创建了两个线程,其中一个线程在访问共享变量i的时候获取了锁,另一个线程就要等待获取锁的线程释放锁之后才能访问i。
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Mutex mutex = new Mutex();
int i = 0;
Thread t1 = new Thread(() =>
{
mutex.WaitOne(); // 获取锁
for (int j = 0; j < 100000; j++)
{
i++;
}
mutex.ReleaseMutex(); // 释放锁
});
Thread t2 = new Thread(() =>
{
mutex.WaitOne(); // 获取锁
for (int j = 0; j < 100000; j++)
{
i++;
}
mutex.ReleaseMutex(); // 释放锁
});
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine($"i = {i}");
}
}
执行上面的代码,输出结果应该是200000,即两个线程对i进行了累加操作。
示例二
在下面的示例中,我们使用Mutex类来保证只有一个线程可以访问包含共享资源的代码块。
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Mutex mutex = new Mutex();
for (int i = 0; i < 5; i++)
{
new Thread(() =>
{
mutex.WaitOne(); // 获取锁
Console.WriteLine($"当前线程ID为{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"线程{Thread.CurrentThread.ManagedThreadId}进入临界区");
Thread.Sleep(1000);
Console.WriteLine($"线程{Thread.CurrentThread.ManagedThreadId}离开临界区");
mutex.ReleaseMutex(); // 释放锁
}).Start();
}
Console.ReadLine();
}
}
在上面的代码中,我们通过Mutex对象来保护包含的代码块,其中WaitOne()方法获得锁,ReleaseMutex()方法释放锁,从而保证同一时间只有一个线程可以访问临界区,结果输出应该如下:
当前线程ID为4
线程4进入临界区
当前线程ID为3
线程3进入临界区
当前线程ID为5
线程5进入临界区
当前线程ID为6
线程6进入临界区
当前线程ID为7
线程7进入临界区
线程5离开临界区
线程7离开临界区
线程6离开临界区
线程3离开临界区
线程4离开临界区
从输出结果可以看出,每个线程都可以进入临界区执行,但是同一时间只有一个线程可以进入,即Mutex保证了同步。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#互斥锁Mutex类用法介绍 - Python技术站