如果我在線程完成互斥體之前在互斥體上調用了CloseHandle,並且尚未調用ReleaseMutex,那麼期望的行爲是什麼?ReleaseMutex之前在互斥體上的CloseHandle - 會發生什麼?
4
A
回答
9
最嚴重的後果是一個線程正在等待互斥鎖被解鎖。 WaitXxx調用返回WAIT_ABANDONED。在這個時候,調用TerminateProcess將會是一個非常好的主意,因爲你不知道剛剛發生了什麼。
11
CloseHandle()
立即銷燬傳遞給它的句柄。如果使用關閉的互斥鎖句柄調用,則ReleaseMutex()
將失敗並顯示ERROR_INVALID_HANDLE
錯誤代碼。
如果指定了互斥鎖,則會有一個支持該互斥鎖的引用計數的內核對象,但CreateMutex()
和OpenMutex()
會返回必須單獨關閉的唯一HANDLE
值。如果創建/打開多個同名互斥體的句柄,則在一個句柄上調用CloseHandle()
不會影響同一互斥體的其他句柄。
1
CloseHandle()在這種情況下會銷燬句柄,但只有在關閉了所有句柄後,互斥對象才從內存中移除。 所以,通過CloseHandle(句柄)你將銷燬該句柄,因此ReleaseMutex(句柄)將不起作用。但是,互斥體仍將由該線程擁有,無法釋放它,影響等待互斥鎖的其他線程。
相關問題
- 1. 爲什麼我的互斥體類有時不會刪除互斥體文件?
- 2. 爲什麼互斥體不需要互斥體(並且該互斥體需要互斥體...)
- 3. wait()/ signal()塊中的互斥量獲取會發生什麼?
- 4. 如果我等待關閉的互斥鎖,會發生什麼?
- 5. 如果在獲得互斥鎖後發生中斷,會發生什麼情況
- 6. Main()之前會發生什麼?
- 7. 互斥體和臨界區之間的邊界是什麼?
- 8. 爲什麼互斥體不被獲取?
- 9. 在模塊之間共享互斥體
- 10. 在運行時選擇互斥體或虛擬互斥體
- 11. 仿生(android libc)互斥體變體
- 12. 讀寫之間的互斥
- 13. 共享互斥和互斥之間的區別(爲什麼都存在於C++ 11併發中)?
- 14. Vim:交互式檢查替代之前發生了什麼?
- 15. 在em.close()之後,延遲加載的實體會發生什麼?
- 16. 當一個線程完成其互斥量時,線程會發生什麼?
- 17. 線程嘗試訪問互斥鎖定資源時會發生什麼?
- 18. 如果兩個用戶同時鎖定互斥鎖,會發生什麼情況?
- 19. 在互斥代碼中發生死鎖
- 20. 互斥體機制
- 21. 什麼是「分裂互斥」?
- 22. EventQueues和互斥體
- 23. 互斥體和信號量實際上做了什麼?
- 24. Ruby和互斥體
- 25. 爲什麼即使您擁有互斥鎖,互斥鎖try_lock也會返回false?
- 26. Node.js和互斥體
- 27. 如果在SqlDataReader之前關閉SqlConnection,會發生什麼情況?
- 28. Solr:autoCommit如果Solr在提交之前關閉會發生什麼
- 29. 在動作之前UNION父rdd和子rdd會發生什麼?
- 30. 在調用applicationDidFinishLaunching之前會發生什麼?
做這樣的事情會有什麼理由? – 2011-02-17 20:50:02
@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