事件对象和条件变量有什么区别? 我在WIN32 API的环境中问。事件对象和条件变量的区别
回答
事件对象是内核级的对象。它们可以跨进程边界共享,并且在所有Windows操作系统版本上都受支持。如果需要,它们可以用作它们自己的独立锁来共享资源。由于它们是内核对象,操作系统一次对可分配的事件数量有限制。
条件变量是用户级别的对象。它们不能跨进程边界共享,只在Vista/2008及更高版本上受支持。他们不会充当自己的锁,但需要与他们关联的单独锁,如关键部分。由于它们是用户对象,因此可用变量的数量受可用内存的限制。当条件变量进入睡眠状态时,它会自动释放指定的锁定对象,以便另一个线程可以获取它。当条件变量醒来时,它会自动重新获取指定的锁定对象。
在功能方面,认为条件变量为一起工作的两个对象的逻辑组合的 - 一个keyed event和锁定对象。当条件变量进入睡眠状态时,它会重置事件,释放锁定,等待事件发出信号,然后重新获取锁定。举例来说,如果你使用一个关键部分为锁定对象,SleepConditionalVariableCS()
类似于呼叫到ResetEvent()
,LeaveCriticalSection()
,WaitForSingleObject()
和EnterCriticalSection()
序列。而如果你使用SRWL作为锁,SleepConditionVariableSRW()
类似于呼叫到ResetEvent()
,ReleaseSRWLock...()
,WaitForSingleObject()
和AcquireSRWLock...()
序列。
它们非常相似,但事件对象跨越流程边界工作,而条件变量却不行。从MSDN documentation on condition variables:
条件变量是用户模式不能跨越 进程共享 对象。
从MSDN documentation on event objects:
版面中的其他进程可以通过 打开 手柄到现有事件对象到 OpenEvent函数的调用指定其名称。
不,雷米勒博更接近真相。条件变量是最近从Unix导入Windows的东西。事件对象是一个苍白的模仿条件。事实上,仅仅给定事件对象和互斥体才能实现条件变量是不平凡的。请参阅http://www.cse.wustl.edu/~schmidt/win32-cv-1.html – Arkadiy 2009-08-01 01:04:42
最显著差异是事件对象是一个内核对象,并且可以跨过程,只要它是当进程/线程试图获取活共享,与此相反,条件变量是一个用户模式对象,它是光(只有与指针相同的尺寸,使用后才会释放任何东西)并且性能更好。
通常,条件变量通常与锁一起使用,因为我们需要保持数据正确同步。当考虑条件变量时,我们将它视为自Vista以来改进的键控事件。
乔·达菲有一个博客帖子http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/是解释更详细的信息。
- 1. 对象和变量有什么区别?
- 2. 条件变量在对象
- 3. 对象和变量对象之间的区别
- 4. 同步块和条件变量锁之间有什么区别?
- 5. Windows中的内核对象和事件对象有什么区别?
- 6. 克隆和扩展骨干事件对象有什么区别?
- 7. JavaScript如何识别事件对象变量?
- 8. 可变对象和不可变对象之间的区别
- 9. %变量%和!变量之间的区别!批处理文件
- 10. JavaScript的:区分DOM元素对象和事件对象
- 11. 变量和声明对象之间的区别
- 12. **变量和变量[] []之间的区别?
- 13. Windows条件变量与事件
- 14. Win32事件与条件变量
- 15. RoboFramework中资源文件和变量文件的区别?
- 16. OnClick()事件和OnClickListener之间的区别?
- 17. JSF:ViewActions和preRender事件之间的区别
- 18. 事件和方法之间的区别
- 19. OnLoad方法和Load事件的区别?
- 20. LinkLabel.Click和LinkLabel.LinkClicked事件之间的区别?
- 21. 加入的条件和条件之间的区别
- 22. “DOMContent事件”和“加载事件”之间的区别
- 23. particle.cloud中的particle.publish事件和particle.subscribe事件有什么区别?
- 24. 互斥和条件变量之间的决定性区别是什么?
- 25. 信号量和条件之间的区别(ReentrantLock)
- 26. 区别对象和功能
- 27. pthread和条件变量
- 28. Visual Studio中的KeyDown事件,KeyPress事件和KeyUp事件之间的区别
- 29. JS:事件和变量
- 30. 行动和事件有什么区别?
我不明白,如果CS中包含一个事件,那么如何声称它受可用内存的限制而不是系统中可用事件的数量? – Mehrdad 2015-03-03 21:08:12