c#中mutex
是互斥鎖,位於system.threading
命名空間中。
顧名思義,它是乙個互斥的物件,同一時間只有乙個執行緒可以擁有它,該類還可用於程序間同步的同步基元。
如果當前有乙個執行緒擁有它,在沒有釋放之前,其它執行緒是沒有權利擁有它的。我們可以把mutex
看作洗手間,上廁所的人看作執行緒;上廁所的人先進洗手間,擁有使用權,上完廁所之後出來,把洗手間釋放,其他人才可以使用。
執行緒使用mutex.waitone()
方法等待c#mutex
物件被釋放,如果它等待的c#mutex
物件被釋放了,它就自動擁有這個物件,直到它呼叫mutex.releasemutex()
方法釋放這個物件,而在此期間,其他想要獲取這個c#mutex
物件的執行緒都只有等待。
我們可以利用這個特性來控制乙個應用程式只能執行乙個例項(單例)。其他例項由於得不到這個mutex
而不能執行。
**如下所示:
using system;
using system.threading;
public
class
}private
static
mutex m_mutex;
private
static
readonly
string m_name ="";
///
/// 程序是否可以建立
///
/// 是否可以建立
private
static
bool
cancreate()
}
這裡先執行乙個例項,然後再執行第二個,通過日誌可以檢視啟動過程,如下所示:
2016-11-23 13:47:05 -[ warn]- can't run the environment now, because one instance is already running!
從日誌可以看出,當第二個例項想執行的時候,由於已經有乙個程序擁有了這個互斥鎖,此程序不能擁有,所以程序啟動被終止。
此外還需說明一點,mutex
的name
是在系統中是唯一的,也就是上述**中的name
,系統依靠這個name
屬性來標識唯一的mutex
。
C 實現mutex 互斥鎖
思路 實現mutex最重要的就是實現它的lock 方法和unlock 方法。我們儲存乙個全域性變數flag,flag 1表明該鎖已經鎖住,flag 0表明鎖沒有鎖住。實現lock 時,使用乙個while迴圈不斷檢測flag是否等於1,如果等於1就一直迴圈。然後將flag設定為1 unlock 方法就...
c 互斥鎖(Mutex)使用詳解
互斥鎖 mutex 互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況 函式 建立乙個處於未獲取狀態的互斥鎖 public mutex 如果owned為true,互斥鎖的初始狀態就是被主線程所獲取,否則處於未獲取狀態 pu...
互斥鎖 mutex 的使用
互斥鎖的使用範圍 互斥鎖 mutex 是在原子操作api的基礎上實現的訊號量行為。互斥鎖不能進行遞迴鎖定或解鎖,能用於互動上下文但是不能用於中斷上下文,同一時間只能有乙個任務持有互斥鎖,而且只有這個任務可以對互斥鎖進行解鎖。當無法獲取鎖時,執行緒進入睡眠等待狀態。互斥鎖的資料結構 struct mu...