2009-07-31 32 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/是解释更详细的信息。

相关问题