Mutex物件是一個同步基元,可以用來做執行緒間的同步。
若多個執行緒需要共享一個資源,可以在這些執行緒中使用Mutex同步基元。當某一個執行緒佔用Mutex物件時,其他也需要佔用Mutex的執行緒將處於掛起狀態。
示例程式碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace myTest { class Program { static List<string> enterList = new List<string>();//用來記錄結果 static Mutex mt = new Mutex();//建立一個同步基元 static int threadNum = 3, round = 3; //開啟3個執行緒,每個執行緒測試3輪 //階段控制物件,每一輪完成後列印結果 static Barrier br = new Barrier(threadNum, (b) => { Console.WriteLine(String.Format("第{0}輪測試完成,執行緒獲取互斥體情況如下:",(b.CurrentPhaseNumber+1))); foreach (string enter in enterList) { Console.WriteLine(enter); } enterList.Clear(); if (b.CurrentPhaseNumber == round-1) { Console.WriteLine("所有測試完成!"); Console.ReadLine(); } }); static void Main(string[] args) { int i; Thread t; for (i = 0; i < threadNum; i++) { t = new Thread(startTest); t.Name = "t" + (i+1); t.Start(); } } static void startTest(){ int i; for (i = 0; i < round; i++) { testMutex(); } } static void testMutex() { mt.WaitOne(); enterList.Add(String.Format("{0}-執行緒{1}獲取互斥體", DateTime.Now.ToString(), Thread.CurrentThread.Name)); Thread.Sleep(1000); enterList.Add(String.Format("{0}-執行緒{1}釋放互斥體", DateTime.Now.ToString(), Thread.CurrentThread.Name)); mt.ReleaseMutex(); br.SignalAndWait(); } } }