Mutex
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(); //释放锁 } }
运行结果:
案例二:
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; } }
运行结果:
三、总结
为避免发送多线程发生死锁,Mutex的WaitOne()和ReleaseMutex()需成对配合使用。
本文来自博客园,作者:码农阿亮,转载请注明原文链接:https://www.cnblogs.com/wml-it/p/14822648.html
技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
开源库地址,欢迎点亮:
GitHub:https://github.com/ITMingliang
Gitee: https://gitee.com/mingliang_it
GitLab: https://gitlab.com/ITMingliang
建群声明: 本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,为大家答疑解惑。热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!进群方式:扫码关注公众号,后台回复【进群】。