CREATEMUTEX


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()是把互斥量變為有信號。

WaitForSingleObject

函數原型為:
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM