C#多线程系列之进程同步Mutex类
概述
在多线程编程中,由于线程的并发访问,容易出现共享变量问题,需要通过锁机制实现互斥访问,避免线程间的竞争。而Mutex(Mutual Exclusion)就是一种进程同步的机制,可以保证多线程或多进程中的共享资源的互斥访问,从而实现线程安全。
Mutex类
在C#中,Mutex类提供了一种方便的进程同步机制,通过Mutex.WaitOne()方法可以阻塞其他线程或进程对共享变量进行访问。
下面展示一个Mutex的详细使用示例。
using System;
using System.Threading;
namespace MutexDemo
{
class Program
{
static Mutex mutex = new Mutex();
static int counter = 0;
static void Main(string[] args)
{
Thread t1 = new Thread(IncrementCounter);
Thread t2 = new Thread(IncrementCounter);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine($"Final counter value is: {counter}");
Console.ReadKey();
}
static void IncrementCounter()
{
for(int i = 0; i < 100000; i++)
{
mutex.WaitOne();
counter++;
mutex.ReleaseMutex();
}
}
}
}
在上述代码中,我们通过Mutex.WaitOne()方法来实现线程间的访问互斥,并通过mutex.ReleaseMutex()方法释放锁,实现线程安全的共享变量的操作。
应用场景
Mutex类一般用于多线程或多进程的同步,具体应用场景包括但不限于:
- 文件或数据库访问;
- 内存资源的访问;
- 任何需要防止竞争访问的共享资源操作。
示例
下面通过两个示例来进一步说明Mutex类的使用方法。
示例1:文件读写
通过Mutex可以很方便地实现对文件的并发读写操作,从而防止读写锁冲突和数据丢失。
using System;
using System.IO;
using System.Threading;
namespace MutexDemo
{
class Program
{
static Mutex mutex = new Mutex();
static string filePath = "test.txt";
static void Main(string[] args)
{
StreamWriter writer1 = new StreamWriter(filePath, true);
StreamWriter writer2 = new StreamWriter(filePath, true);
Thread t1 = new Thread(() => WriteFile(writer1, "Thread1"));
Thread t2 = new Thread(() => WriteFile(writer2, "Thread2"));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
writer1.Dispose();
writer2.Dispose();
Console.WriteLine("Write completed.");
Console.ReadKey();
}
static void WriteFile(StreamWriter writer, string threadName)
{
mutex.WaitOne();
writer.WriteLine($"{threadName} is writing file...");
Thread.Sleep(1000);
mutex.ReleaseMutex();
}
}
}
示例2:多进程访问共享资源
通过Mutex,可以实现多个进程之间对共享资源的安全访问。
using System;
using System.Diagnostics;
using System.Threading;
namespace MutexDemo
{
class Program
{
static Mutex mutex = new Mutex();
static void Main(string[] args)
{
Process[] processes = new Process[3];
for (int i = 0; i < 3; i++)
{
ProcessStartInfo info = new ProcessStartInfo("MutexDemo.exe", i.ToString());
processes[i] = Process.Start(info);
}
foreach (Process p in processes)
{
p.WaitForExit();
}
Console.WriteLine("All processes exited.");
Console.ReadKey();
}
static void PrintNumber(int processNumber)
{
mutex.WaitOne();
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Process {processNumber} prints {i+1}");
Thread.Sleep(50);
}
mutex.ReleaseMutex();
}
}
}
在上述示例中,我们通过Mutex类来控制多个进程对共享资源的访问,从而实现安全的进程间通讯。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程系列之进程同步Mutex类 - Python技术站