使用互斥體使程序只運行一個

何爲互斥體

引用了百科的話

互斥體實現了“互相排斥”(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的錯誤返回值,
判斷後直接返回,這樣就實現了,程序的單個運行

發佈了65 篇原創文章 · 獲贊 60 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章