代码示例
using System;
using System.Threading;
class Program
{
private static Mutex mutex = new Mutex();
private static int sharedResource = 0;
static void Main()
{
// 创建并启动多个线程
Thread[] threads = new Thread[5];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(AccessSharedResource);
threads[i].Start();
}
// 等待所有线程完成
foreach (var thread in threads)
{
thread.Join();
}
Console.WriteLine("所有线程执行完毕,共享资源的值为: " + sharedResource);
mutex.Close();
}
static void AccessSharedResource()
{
// 请求Mutex的控制权
mutex.WaitOne();
try
{
// 访问共享资源
Console.WriteLine(Thread.CurrentThread.Name + " 进入临界区,开始访问共享资源。");
sharedResource++;
Console.WriteLine(Thread.CurrentThread.Name + " 对共享资源操作后,其值为: " + sharedResource);
Console.WriteLine(Thread.CurrentThread.Name + " 离开临界区。");
}
finally
{
// 释放Mutex的控制权
mutex.ReleaseMutex();
}
}
}
Mutex工作原理
- 基本概念:Mutex(互斥锁)是一种同步基元,它只允许一个线程进入临界区,从而保证同一时间只有一个线程可以访问共享资源。它维护一个内部计数器,初始值为1。
- 获取锁:当一个线程调用
WaitOne
方法时,Mutex的内部计数器减1。如果计数器变为0,意味着该线程获得了Mutex的控制权,可以进入临界区访问共享资源。如果计数器已经为0(表示已有其他线程持有Mutex),调用 WaitOne
的线程将被阻塞,直到持有Mutex的线程释放它。
- 释放锁:当持有Mutex的线程调用
ReleaseMutex
方法时,Mutex的内部计数器加1。如果此时有其他线程在等待Mutex,系统会选择一个等待的线程,将其从阻塞状态唤醒,该线程可以再次尝试获取Mutex(即再次调用 WaitOne
使计数器减1),进入临界区。这样就确保了同一时间只有一个线程能够访问共享资源,实现了线程同步。