2011-02-26 101 views
1

喜歡所以我叫createmutex所以CreateMutex混亂

while(1){ 
    HANDLE h; 
    h=CreateMutex(NULL,TRUE,"mutex1"); 
    y=WaitForSingleObject(h,INFINITE); 
    ///random code 
    ReleaseMutex(h) 
    } 

它運行循環兩次後罰款,但在第三圈後WaitForSingleObject的(H,INFINITE)死鎖。這是與兩個線程同時運行。 ReleaseMutex被調用時它怎麼會死鎖?是否正確調用了createmutex函數?

回答

4

你正在等待一個已經擁有的互斥體......請不要那麼做。

此外,你並沒有破壞互斥體,只是釋放它。下一個電話應該給你ERROR_ALREADY_EXISTS。從MSDN完整引用是"If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object, GetLastError returns ERROR_ALREADY_EXISTS, bInitialOwner is ignored, and the calling thread is not granted ownership."

如果任何「隨機代碼」等待其他線程進展,它可能死鎖擁有互斥體。在這種情況下,另一個線程將永遠等待嘗試獲取互斥鎖,這就是您所看到的行爲。

+0

所以用一個false參數調用CreateMutex,並把它放在while循環之外 – Jake 2011-02-26 06:11:04

3

我懷疑你正試圖在單個進程中實現互斥。如果是這樣,那麼正確的同步對象是critical section。這些對象的命名有點令人困惑,因爲互斥和關鍵部分都會互相排斥。

臨界區的界面使用起來更簡單,它本質上是一個獲取函數和相應的釋放函數。如果你在一個進程中同步,並且你需要一個簡單的鎖(而不是信號量),你應該使用臨界區而不是互斥鎖。實際上,最近在Stack Overflow上,我寫了一個更多的detailed answer來描述關鍵部分的標準使用模式。該文章有很多鏈接到MSDN文檔的相關部分。

當您執行跨進程同步時,您只需要使用互斥鎖。事實上,當你在一個進程中進行同步時,你應該只使用一個互斥體,因爲關鍵部分表現得更好(即更快)。