在編程的時候經常會用到多線程,有時候如果多線程操作同一個資源就會導致沖突,.NET提供了多種方法來防止沖突發生,這里講下Mutex
該類位於System.Threading命名空間,常用的方式是這樣:
var mutex = new Mutex(true, "Test", out var flag);
參數分別是:
1:給調用線程賦予互斥體的初始所屬權
2:鎖名稱
3:如果調用線程已被授予互斥體的初始所屬權,則返回true
notice:這個鎖的有效范圍是全系統
也就是說不同進程之間如果鎖名稱相同會互相影響.使用時需要注意這點.
代碼:
static void Main(string[] args) { var mutex = new Mutex(true, "Test", out var flag); { Task.Factory.StartNew(Th); Console.WriteLine(flag.ToString()); Console.WriteLine("按任意鍵繼續:"); Console.ReadKey(true); mutex.ReleaseMutex(); } Console.ReadKey(true); } private static void Th() { var mutex = new Mutex(true, "Test", out var flag); { if (!flag) { //等待3s互斥鎖 flag = mutex.WaitOne(3000, true); if (flag) { Console.Write(1); } else { Console.Write("沒有得到互斥鎖,嘗試無限等待..."); //無限等待互斥鎖 mutex.WaitOne(); Console.Write(1); } } mutex.ReleaseMutex(); } }