C#线程互斥Multex和Event小用

本文通过一个示例程序展示了如何使用互斥锁(Mutex)进行线程间的同步操作,包括Mutex的基本用法、WaitAll、WaitOne及WaitAny等方法的应用。四个线程分别演示了不同的等待和释放互斥锁的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;

using System.Threading;

namespace MyMutexSample

{

class MutexSample

{

static Mutex mutex1;

static Mutex mutex2;

static AutoResetEvent event1 = new AutoResetEvent(false);

static AutoResetEvent event2 = new AutoResetEvent(false);

static AutoResetEvent event3 = new AutoResetEvent(false);

static AutoResetEvent event4 = new AutoResetEvent(false);

static void Main(string[] args)

{

Console.WriteLine("Mutex Sample....");

mutex1 = new Mutex(true, "MyMutex1");

mutex2 = new Mutex(true);

Console.WriteLine("Main owns mutex1 and multex2");

AutoResetEvent[] events = new AutoResetEvent[4];

events[0] = event1;

events[1] = event2;

events[2] = event3;

events[3] = event4;

MutexSample mutexSample = new MutexSample();

Thread thread1 = new Thread(new ThreadStart(mutexSample.Method1));

Thread thread2 = new Thread(new ThreadStart(mutexSample.Method2));

Thread thread3 = new Thread(new ThreadStart(mutexSample.Method3));

Thread thread4 = new Thread(new ThreadStart(mutexSample.Method4));

thread1.Start();

thread2.Start();

thread3.Start();

thread4.Start();

Thread.Sleep(2000);

Console.WriteLine("Main release mutex1");

mutex1.ReleaseMutex();

Thread.Sleep(1000);

Console.WriteLine("Main release mutex2");

mutex2.ReleaseMutex();

WaitHandle.WaitAll(events);

Console.WriteLine("...Mutex sample completed executing.");

Console.ReadKey();

}

public void Method1()

{

Console.WriteLine("Method1() started, Mutex.WaitAll(Mutex[])");

Mutex[] mutexes = new Mutex[2];

mutexes[0] = mutex1;

mutexes[1] = mutex2;

Mutex.WaitAll(mutexes);

Thread.Sleep(2000);

Console.WriteLine("Method1() finished, Mutex.WaitAll(Mutex[]) satisfied");

mutexes[0].ReleaseMutex();

mutexes[1].ReleaseMutex();

event1.Set();

}

public void Method2()

{

Console.WriteLine("Method2() started, mutex1.WaitOne()");

mutex1.WaitOne();

Thread.Sleep(2000);

Console.WriteLine("Method2() finished, mutex1.WaitOne() satisfied");

mutex1.ReleaseMutex();

event2.Set();

}

public void Method3()

{

Console.WriteLine("Method3() started, Mutex.WaitAny(Mutex[])");

Mutex[] mutexes = new Mutex[2];

mutexes[0] = mutex1;

mutexes[1] = mutex2;

Mutex.WaitAny(mutexes);

Thread.Sleep(2000);

Console.WriteLine("Method3() finished, Mutex.WaitAny(Mutex[]) satisfied");

mutexes[0].ReleaseMutex();

event3.Set();

}

public void Method4()

{

Console.WriteLine("Method4() started, mutex2.WaitOne()");

mutex2.WaitOne();

Thread.Sleep(2000);

Console.WriteLine("Method4() finished, mutex2.WaitOne() satisfied");

mutex2.ReleaseMutex();

event4.Set();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值