软件编程
位置:首页>> 软件编程>> C#编程>> C#多线程中的互斥锁Mutex

C#多线程中的互斥锁Mutex

作者:農碼一生  发布时间:2022-04-26 06:11:55 

标签:C#,多线程,互斥锁,Mutex

一、简介

Mutex的突出特点是可以跨应用程序域边界对资源进行独占访问,即可以用于同步不同进程中的线程,这种功能当然这是以牺牲更多的系统资源为代价的。

主要常用的两个方法:

  • public virtual bool WaitOne() 阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号获取互斥锁。

  • public void ReleaseMutex() 释放 System.Threading.Mutex 一次。

二、代码

案例一:

class Program
   {
       private static Mutex mutex = new Mutex();
       static void Main(string[] args)
       {
           Thread[] thread = new Thread[3];
           for (int i = 0; i < 3; i++)
           {
               thread[i] = new Thread(ThreadMethod1);//方法引用
               thread[i].Name = "Thread-" + (i+1).ToString();
           }
           for (int i = 0; i < 3; i++)
           {
               thread[i].Start();
           }
           Console.ReadKey();
       }
       public static void ThreadMethod1(object val)
       {          
           mutex.WaitOne();//获取锁
           for (int i = 1; i <=5; i++)
           {
               Console.WriteLine("{0}循環了{1}次", Thread.CurrentThread.Name, i);
           }
           mutex.ReleaseMutex();  //释放锁
       }
   }

运行结果:

C#多线程中的互斥锁Mutex

案例二:

class Program
   {
       private static Mutex mutex = new Mutex();
       private static int sum = 0;
       static void Main(string[] args)
       {
           Task<int> task = new Task<int>(ThreadFunction);
           task.Start();
           Console.WriteLine($"{DateTime.Now} task started!");
           Thread.Sleep(2000);//Main主線程

Console.WriteLine($"{DateTime.Now} Get siginal in Main!");
           mutex.WaitOne();
           Console.WriteLine($"{DateTime.Now} Get siginal in main!");

Console.WriteLine($"{DateTime.Now} Result is {task.Result}");
           Console.ReadKey();
       }
       private static int ThreadFunction()
       {
           Console.WriteLine($"{DateTime.Now} Get siginal in ThreadFunction!");
           mutex.WaitOne();//获取锁
           for (int i = 0; i <= 10; i++)
           {
               sum += i;
               Thread.Sleep(1000);
           }
           Console.WriteLine($"{DateTime.Now} Release mutex in ThreadFunction!");
           mutex.ReleaseMutex(); //释放锁

return sum;
       }
   }

运行结果:

C#多线程中的互斥锁Mutex

三、总结

为避免发送多线程发生死锁,Mutex的WaitOne()和ReleaseMutex()需成对配合使用。

来源:https://www.cnblogs.com/wml-it/p/14822648.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com