计算机系统应用教程网站

网站首页 > 技术文章 正文

3-2互斥对象Mutex-C#多线程编程基础

btikc 2024-10-12 10:46:48 技术文章 10 ℃ 0 评论

在C#中,Mutex类是一种用于实现线程互斥的同步工具。它提供了一些方法,可以用来控制多个线程对共享资源的访问。

以下是Mutex类的一些常用方法和说明:

  1. WaitOne():该方法会使当前线程等待,直到另一个线程释放了互斥对象的锁。当调用Wait()方法时,当前线程会释放互斥对象的锁,并进入等待队列。当其他线程释放了互斥对象的锁时,等待队列中的线程会被唤醒并重新获取互斥对象的锁。该方法在.net4.7.2下不存在了
  2. ReleaseMutex():该方法会释放互斥对象的锁,允许其他线程获取该锁并访问共享资源。调用ReleaseMutex()方法时,当前线程会释放互斥对象的锁,并通知等待队列中的线程。
  3. WaitOne():该方法会等待直到另一个线程释放了互斥对象的锁,或者直到超时时间到达。如果超时时间到达而互斥对象没有被释放,那么当前线程将继续等待。
  4. WaitOne(TimeSpan)和WaitOne(int):这些方法是WaitOne()方法的重载版本,它们接受一个TimeSpan或一个整数作为超时时间的参数。如果在指定的超时时间内互斥对象被释放,那么当前线程会重新获取互斥对象的锁并继续执行。

在使用Mutex类时,需要注意的事项:

  • Mutex类只能用于同一进程中的线程同步,不能用于跨进程的线程同步。
  • Wait()和WaitOne()等方法会阻塞当前线程的执行,直到互斥对象被释放。因此,在使用这些方法时需要注意避免死锁和性能问题。
  • ReleaseMutex()方法必须由释放互斥对象的线程调用。如果其他线程试图释放互斥对象的锁,将会导致异常。

完整示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MutexClass
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个互斥对象  
            Mutex mutex = new Mutex(false);

            // 启动两个线程来访问共享资源  
            Thread thread1 = new Thread(() => AccessResource(mutex));
            Thread thread2 = new Thread(() => AccessResource(mutex));
            thread1.Start();
            thread2.Start();

            // 等待两个线程执行完成  
            thread1.Join();
            thread2.Join();
        }
        static void AccessResource(Mutex mutex)
        {
            // 等待互斥对象的锁  
            mutex.WaitOne();

            try
            {
                // 访问共享资源  
                Console.WriteLine("Thread {0} 正在访问的资源.", Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            }
            finally
            {
                // 释放互斥对象的锁  
                mutex.ReleaseMutex();
            }
        }
    }
}

上面程序启动了两个线程来访问共享资源。在访问共享资源之前,线程会等待互斥对象的锁。一旦获取到锁,线程就可以访问共享资源。在访问完成后,线程会释放互斥对象的锁,允许其他线程获取锁并访问共享资源。在示例代码中,使用了try-finally语句来确保锁一定会被释放,即使在访问共享资源时发生了异常。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表