2011-09-09 43 views
2

我的理解是,WaitForMultipleObjectsCRITICAL_SECTION都是爲了等待線程完成。它們都被描述爲線程之間的進程和線程同步機制。如果它們旨在實現相同的目標,它們可以互換使用嗎?如果不是,那麼他們之間有什麼區別?WaitForMultipleObjects vs CRITICAL_SECTION

回答

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

不要CSes使用內核模式事件? – Mehrdad

+0

@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

相關問題