C#中Mutex是互斥鎖,位於System.Threading 命名空間中。
顧名思義,它是一個互斥的對象,同一時間只有一個線程可以擁有它,該類還可用於進程間同步的同步基元。
如果當前有一個線程擁有它,在沒有釋放之前,其它線程是沒有權利擁有它的。我們可以把Mutex看作洗手間,上廁所的人看作線程;上廁所的人先進洗手間,擁有使用權,上完廁所之后出來,把洗手間釋放,其他人才可以使用。
線程使用Mutex.WaitOne()方法等待C# Mutex對象被釋放,如果它等待的C# Mutex對象被釋放了,它就自動擁有這個對象,直到它調用Mutex.ReleaseMutex()方法釋放這個對象,而在此期間,其他想要獲取這個C# Mutex對象的線程都只有等待。
我們可以利用這個特性來控制一個應用程序只能運行一個實例。其他實例由於得不到這個Mutex而不能運行。
代碼如下所示
這里先運行一個實例,然后再運行第二個,通過日志可以查看啟動過程,如下所示
從日志可以看出,當第二個實例想運行的時候,由於已經有一個進程擁有了這個互斥鎖,此進程不能擁有,所以進程啟動被終止。
此外還需說明一點,mutex的name是在系統中是唯一的,也就是上述代碼中的Name,系統依靠這個name屬性來標識唯一的Mutex。