San*_*San 14 c++ winapi multithreading synchronization
事件对象和条件变量之间有什么区别?我在WIN32 API的上下文中询问.
Rem*_*eau 25
事件对象是内核级对象.它们可以跨进程边界共享,并且在所有Windows操作系统版本上都受支持.如果需要,它们可以用作共享资源的独立锁.由于它们是内核对象,因此操作系统对可以一次分配的可用事件数量有限制.
条件变量是用户级对象.它们不能跨进程边界共享,并且仅在Vista/2008及更高版本上受支持.它们不作为自己的锁,但需要单独的锁与它们相关联,例如关键部分.由于它们是用户对象,因此可用变量的数量受可用内存的限制.当条件变量进入休眠状态时,它会自动释放指定的锁定对象,以便另一个线程可以获取它.当条件变量唤醒时,它会再次自动重新获取指定的锁定对象.
在功能方面,将条件变量视为两个对象一起工作的逻辑组合 - 键控事件和锁定对象.当条件变量进入休眠状态时,它会重置事件,释放锁定,等待事件发出信号,然后重新获取锁定.举例来说,如果你使用一个关键部分为锁定对象,SleepConditionalVariableCS()类似于调用序列ResetEvent(),LeaveCriticalSection(),WaitForSingleObject(),和EnterCriticalSection().而如果你使用SRWL作为锁,SleepConditionVariableSRW()类似于调用序列ResetEvent(),ReleaseSRWLock...(),WaitForSingleObject(),和AcquireSRWLock...().