C#多線程中的互斥鎖Mutex
更新時間:2022年04月20日 09:16:37 作者:農(nóng)碼一生
這篇文章介紹了C#多線程中的互斥鎖Mutex,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
一、簡介
Mutex的突出特點是可以跨應用程序域邊界對資源進行獨占訪問,即可以用于同步不同進程中的線程,這種功能當然這是以犧牲更多的系統(tǒng)資源為代價的。
主要常用的兩個方法:
- 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}循環(huán)了{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; } }
運行結果:
三、總結
為避免發(fā)送多線程發(fā)生死鎖,Mutex的WaitOne()和ReleaseMutex()需成對配合使用。
到此這篇關于C#互斥鎖Mutex的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。