何爲互斥體
引用了百科的話
互斥體實現了“互相排斥”(mutual exclusion)同步的簡單形式(所以名爲互斥體(mutex))。互斥體禁止多個線程同時進入受保護的代碼“臨界區”(critical section)。
其實互斥體就像信號量的PV操作一樣的,可以用於線程間的同步,避免一個資源在被一個線程操作的同時,另外的一個線程也在進行操作,這樣就會破壞操作的原子性。帶來未知的錯誤
互斥體的作用
實際上互斥體MUTEX是用於線程同步
比如一個進程先進入臨界區,先獲得鎖
另一個進程想進入時候try lock 發現被佔用
那麼直接返回,或者被掛起,等待這個資源被釋放
互斥體的使用
下面就是簡單的代碼段,實現程序一次只能運行一個
HANDLE hMutex = NULL;
//創建互斥對象
if(NULL != (hMutex = CreateMutex(NULL, FALSE, L"mutex")))
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(NULL, TEXT("Another Instance is RUNNING!!"), TEXT("ERROE"), MB_OK | MB_ICONINFORMATION);
//關閉互斥對象,退出程序 CloseHandle(hMutex);
exit(-1);
}
}
CreateMutex 創建一個互斥體並返回它的句柄 第一個是安全屬性,null是默認, 第二個參數是是否 被隸屬, 第三個也就是互斥體的名字,也就是我們 防止多開的關鍵
原理講解
第一次運行創建了這個有名互斥體 ,
當第二次運行時候,發現存在同名互斥體,所以返回錯誤
使用GetLastError() 就可以得到,ALREADY_EXISTS的錯誤返回值,
判斷後直接返回,這樣就實現了,程序的單個運行