2009-07-31 228 views

回答

21

事件對象是內核級的對象。它們可以跨進程邊界共享,並且在所有Windows操作系統版本上都受支持。如果需要,它們可以用作它們自己的獨立鎖來共享資源。由於它們是內核對象,操作系統一次對可分配的事件數量有限制。

條件變量是用戶級別的對象。它們不能跨進程邊界共享,只在Vista/2008及更高版本上受支持。他們不會充當自己的鎖,但需要與他們關聯的單獨鎖,如關鍵部分。由於它們是用戶對象,因此可用變量的數量受可用內存的限制。當條件變量進入睡眠狀態時,它會自動釋放指定的鎖定對象,以便另一個線程可以獲取它。當條件變量醒來時,它會自動重新獲取指定的鎖定對象。

在功能方面,認爲條件變量爲一起工作的兩個對象的邏輯組合的 - 一個keyed event和鎖定對象。當條件變量進入睡眠狀態時,它會重置事件,釋放鎖定,等待事件發出信號,然後重新獲取鎖定。舉例來說,如果你使用一個關鍵部分爲鎖定對象,SleepConditionalVariableCS()類似於呼叫到ResetEvent()LeaveCriticalSection()WaitForSingleObject()EnterCriticalSection()序列。而如果你使用SRWL作爲鎖,SleepConditionVariableSRW()類似於呼叫到ResetEvent()ReleaseSRWLock...()WaitForSingleObject()AcquireSRWLock...()序列。

+0

我不明白,如果CS中包含一個事件,那麼如何聲稱它受可用內存的限制而不是系統中可用事件的數量? – Mehrdad 2015-03-03 21:08:12

2

它們非常相似,但事件對象跨越流程邊界工作,而條件變量卻不行。從MSDN documentation on condition variables

條件變量是用戶模式不能跨越 進程共享 對象。

MSDN documentation on event objects

版面中的其他進程可以通過 打開 手柄到現有事件對象到 OpenEvent函數的調用指定其名稱。

+6

不,雷米勒博更接近真相。條件變量是最近從Unix導入Windows的東西。事件對象是一個蒼白的模仿條件。事實上,僅僅給定事件對象和互斥體才能實現條件變量是不平凡的。請參閱http://www.cse.wustl.edu/~schmidt/win32-cv-1.html – Arkadiy 2009-08-01 01:04:42

1

最顯著差異是事件對象是一個內核對象,並且可以跨過程,只要它是當進程/線程試圖獲取活共享,與此相反,條件變量是一個用戶模式對象,它是光(只有與指針相同的尺寸,使用後纔會釋放任何東西)並且性能更好。

通常,條件變量通常與鎖一起使用,因爲我們需要保持數據正確同步。當考慮條件變量時,我們將它視爲自Vista以來改進的鍵控事件。

喬·達菲有一個博客帖子http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/是解釋更詳細的信息。