C#中Mutex的用法

C#中Mutex是互斥锁,位于System.Threading 命名空间中。

顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元。

如果当前有一个线程拥有它,在没有释放之前,其它线程是没有权利拥有它的。我们可以把Mutex看作洗手间,上厕所的人看作线程;上厕所的人先进洗手间,拥有使用权,上完厕所之后出来,把洗手间释放,其他人才可以使用。

线程使用Mutex.WaitOne()方法等待C# Mutex对象被释放,如果它等待的C# Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个C# Mutex对象的线程都只有等待。

我们可以利用这个特性来控制一个应用程序只能运行一个实例。其他实例由于得不到这个Mutex而不能运行。

代码如下所示


这里先运行一个实例,然后再运行第二个,通过日志可以查看启动过程,如下所示

从日志可以看出,当第二个实例想运行的时候,由于已经有一个进程拥有了这个互斥锁,此进程不能拥有,所以进程启动被终止。

此外还需说明一点,mutex的name是在系统中是唯一的,也就是上述代码中的Name,系统依靠这个name属性来标识唯一的Mutex。

C#中的Mutex是多线程同步机制之一,用于解决多线程编程中的同步问题。 ### 使用方法 在C#,可通过创建`Mutex`类的实例来使用它。使用时,线程在访问共享资源前需调用`WaitOne`方法获取互斥体,访问结束后调用`ReleaseMutex`方法释放互斥体。相关代码示例如下: ```csharp using System; using System.Threading; class Program { // 创建一个互斥体实例 private static Mutex mutex = new Mutex(); static void Main() { // 创建多个线程来模拟并发访问 Thread[] threads = new Thread[5]; for (int i = 0; i < 5; i++) { threads[i] = new Thread(Worker); threads[i].Start(); } // 等待所有线程完成 foreach (Thread thread in threads) { thread.Join(); } Console.WriteLine("All threads have completed."); } static void Worker() { // 等待获取互斥体 mutex.WaitOne(); try { // 模拟一些工作 Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is working."); Thread.Sleep(1000); } finally { // 释放互斥体 mutex.ReleaseMutex(); } } } ``` 在上述代码中,`mutex.WaitOne()`会让线程等待,直到获取到互斥体;`mutex.ReleaseMutex()`则用于释放互斥体,以便其他线程可以获取它。 ### 原理 Mutex(互斥体)是一种同步原语,它确保同一时间只有一个线程可以访问共享资源。其工作原理基于操作系统提供的内核对象,当一个线程获取到互斥体时,其他线程尝试获取该互斥体时会被阻塞,直到持有互斥体的线程释放它。 ### 应用场景 Mutex适用于多个线程需要互斥访问共享资源的场景,例如多个线程同时访问文件、数据库连接等。通过使用Mutex,可以避免多个线程同时修改共享资源而导致的数据不一致问题,提升多线程程序的并发控制与数据安全性,帮助开发者在不同场景下选择合适的同步机制来解决多线程编程中的同步问题 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值