我的理解是,WaitForMultipleObjects
和CRITICAL_SECTION
都是爲了等待線程完成。它們都被描述爲線程之間的進程和線程同步機制。如果它們旨在實現相同的目標,它們可以互換使用嗎?如果不是,那麼他們之間有什麼區別?WaitForMultipleObjects vs CRITICAL_SECTION
2
A
回答
3
他們不能互換,用於不同的目的。
A 臨界區是一個互斥量。封裝在關鍵字中的代碼塊可以一次由一個線程輸入。這也稱爲序列化,因爲受保護的塊是串行執行的。
WaitForMultipleObjects
函數及其各種親屬用於阻塞,直到發送同步對象。這可能是一個事件變成信號,線程完成,進程完成,互斥變得可用等。
通常使用等待函數來確保依賴性被正確處理。例如,如果計算只能在其他計算完成時才進行,則將使用等待函數阻止,直到其他計算完成。使用適當的等待功能而不是繁忙的旋轉外觀避免了浪費時鐘週期。
0
我想從MSDN報價是足夠:
臨界區對象只由一個線程提供類似於由互斥對象條件是 同步,不同之處在於一個關鍵部分可用於 單一過程。事件,互斥鎖和信號量對象也可用於單進程應用程序,但關鍵的對象 提供用於互斥同步(處理器特定測試和 設置指令)的更快,更高效的機制 。
所以Critical Sections
是用於單進程同步。與WaitForMultipleObjects
你可以sinc多個進程。
我要補充的是與WaitForMultipleObjects
你可以等待其他的東西,例如像異步I/O功能,定時器......
0
Critical Section
是用戶對象(注意核心),所以它比任何mutex
(它是核心對象,因此需要系統核心調用)更快。因此,CS
可用於同步一個進程內的線程(不能在一個進程中使用一個CS
)。 WaitForMultipleObjects
使用核心用於同步(互斥,事件)的對象,因此它可以實際用於進程間同步。 要以相同的方式使用CS
,您還需要conditional variable
(不在Win XP中,僅限於以後)。
相關問題
- 1. CRITICAL_SECTION在C++/CLI
- 2. CRITICAL_SECTION在提升?
- 3. Waiting on WaitForMultipleObjects
- 4. WaitForMultipleObjects的崩潰
- 5. SerialPorts和WaitForMultipleObjects
- 6. WaitForMultipleObjects餓死
- 7. WaitForMultipleObjects失敗C++
- 8. Win32中的CRITICAL_SECTION/CONDITION_VARIABLE死鎖
- 9. EnterCriticalSection的和CRITICAL_SECTION在Windows
- 10. 確定要複製CRITICAL_SECTION?
- 11. CRITICAL_SECTION並避免包括windows.h?
- 12. 我應該使用CRITICAL_SECTION嗎?
- 13. Win32 CRITICAL_SECTION包含什麼?
- 14. WaitForMultipleObjects的不正常工作
- 15. waitformultipleobjects句柄數量未知
- 16. Waitformultipleobjects返回無效句柄
- 17. 替換Qt中的WaitForMultipleObjects
- 18. WaitForMultipleObjects和64個線程
- 19. WaitForMultipleObjects替代與STD ::線程?
- 20. WaitHandle.WaitAny匹配WaitForMultipleObjects的功能
- 21. Boost中的WaitForMultipleObjects功能
- 22. 使用DuplicateOutput時CRITICAL_SECTION發生死鎖
- 23. 寫入時WaitForMultipleObjects訪問違規
- 24. 具有CWinThread指針數組的WaitForMultipleObjects
- 25. WaitForMultipleObjects有效,MsgWaitForMultipleObjects失敗 - 爲什麼?
- 26. 如何克服WaitForMultipleObjects的MAXIMUM_WAIT_OBJECTS限制?
- 27. WaitForMultipleObjects的一個互斥和事件
- 28. 爲什麼我不能使用LPCRITICAL_SECTION和CRITICAL_SECTION
- 29. DeleteCriticalSection VS刪除CriticalSection的
- 30. 與CRITICAL_SECTION模板類編譯,但使用它時得到錯誤
不要CSes使用內核模式事件? – Mehrdad
@Mehrdad直到現在我相信它是純粹的用戶模式對象(看起來像我通過C++閱讀Windows不夠小心)。它實際上比互斥或信號量更快。這裏有一些文章:http://www.codeproject.com/Articles/35878/A-Critical-Section-is-not-100-user-mode-synchroniz和http://blogs.msdn.com/b/larryosterman /archive/2005/08/24/455741.aspx – Werolik