HANDLE hMutex;
hMutex = ::CreateMutex(NULL, FALSE, NULL);
::WaitForSingleObject(hMutex, INFINITE); // 1
::WaitForSingleObject(hMutex, INFINITE); // 2
好多初學者都認為,設置為FALSE就是沒有獲得獲得信號。。 其實這是錯誤的。
真確的理解是:
CreateMutex()函數的第二個參數是FALSE,表示剛剛創建的這個Mutex不屬於任何線程
也就是沒有任何線程擁有他,一個Mutex在沒有任何線程擁有他的時候,他是處於激發態的, 所以處於有信號狀態。
當你調用::WaitForSingleObject(hMutex, INFINITE); // 1
時本線程獲得了互斥量,所以互斥量由有信號變為沒信號
調用::ReleaseMutex()是把互斥量變為有信號。
函數原型為:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
hHandle為要監視的對象(一般為同步對象,也可以是線程)的句柄;
dwMilliseconds為hHandle對象所設置的超時值,單位為毫秒;
當在某一線程中調用該函數時,線程暫時掛起,系統監視hHandle所指向的對象的狀態。如果在掛起的dwMilliseconds毫秒內,線程所等待的對象變為有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函數照樣返回。參數dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若為0,則該函數立即返回;若為INFINITE,則線程一直被掛起,直到hHandle所指向的對象變為有信號狀態時為止。
所以第一個::WaitForSingleObject()函數便返回,釋放了該線程對Mutex的擁有權,Mutex又會變成激發態,這樣就導致了第二個::WaitForSingleObject()函數的返回!
主要區分
CreateEvent與
CreateMutex的區別。mutex是互斥量, event就是用來事件通知的。
因為mutex里面的ReleaseMutex是將設置為沒有線程擁有它,有信號;而event里面的resetevent是將設置為無信號.
老奎哥:
mutex是互斥量, 一般用在程序只允許系統里面有一個instance的時候,程序一啟動就檢測這個mutex, 如果有說明該程序已經在運行, 就退出. 否則own這個mutex並繼續運行程序
event一般用在通知, 比如一個事情做完了通知另一個線程, 這里的另一個線程一般是在wait這個event
mutex是保護臨界區的, 當然你非要拿它等待 事件, 也可以, 但語義不同
就是進程的一個實例. 比如記事本(假設), 第一個記事本啟動的時候,mutex沒有被創建, 所以第一個記事本程序創建並擁有該mutex, 然后顯示UI.然后第二個記事本啟動的時候, 發現mutex已經存在, 說明已經有記事本在運行了,那么第二個記事本直接退出. 這樣保證系統里只有一個instance