2011-02-17 69 views
4

如果我在線程完成互斥體之前在互斥體上調用了CloseHandle,並且尚未調用ReleaseMutex,那麼期望的行爲是什麼?ReleaseMutex之前在互斥體上的CloseHandle - 會發生什麼?

+0

做這樣的事情會有什麼理由? – 2011-02-17 20:50:02

+0

@San Jacinto:MTA COM對象具有正在執行工作並且沒有給調用者調用CoFreeUnusedLibraries(0,0)的線程的時間,延遲爲0,調用DllCanUnloadNow,它返回S_OK,即使互斥量hasn'沒有被釋放。默認情況下,MTA的延遲時間爲10分鐘,以允許線程完成,但在這種情況下,我必須檢查互斥鎖以確保它爲NULL,否則返回DllCanUnloadNow中的S_FALSE。這阻止了我們正在訪問的內存訪問。現在,等待互斥體== NULL的問題是沒有任何明確的方法調用它的CloseHandle。 – 2011-02-18 03:27:13

回答

9

最嚴重的後果是一個線程正在等待互斥鎖被解鎖。 WaitXxx調用返回WAIT_ABANDONED。在這個時候,調用TerminateProcess將會是一個非常好的主意,因爲你不知道剛剛發生了什麼。

11

CloseHandle()立即銷燬傳遞給它的句柄。如果使用關閉的互斥鎖句柄調用,則ReleaseMutex()將失敗並顯示ERROR_INVALID_HANDLE錯誤代碼。

如果指定了互斥鎖,則會有一個支持該互斥鎖的引用計數的內核對象,但CreateMutex()OpenMutex()會返回必須單獨關閉的唯一HANDLE值。如果創建/打開多個同名互斥體的句柄,則在一個句柄上調用CloseHandle()不會影響同一互斥體的其他句柄。

1

CloseHandle()在這種情況下會銷燬句柄,但只有在關閉了所有句柄後,互斥對象才從內存中移除。 所以,通過CloseHandle(句柄)你將銷燬該句柄,因此ReleaseMutex(句柄)將不起作用。但是,互斥體仍將由該線程擁有,無法釋放它,影響等待互斥鎖的其他線程。

相關問題