线程同步 -事件Event、临界区对象CriticalSection
事件Event:
基本函数:
全局对象:HANDLE g_hEvent
创建事件对象:g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL):第二个参数bool bManualReset=False:设置为自动重置事件对象
重置状态为无信号:ResetEvent(g_hEvent)
设置状态为有信号:SetEvent(g_hEvent)
说明:
有信号转为无信号状态人为重置过程不可以控,最好设为自动完成,可以避免多个线程请求到对象;原因在于当一个线程WaitForSingleObject(g_hEvent, INFINITE)到一个人工重置事件对象后,并不能保证立马将人工重置事件对象ResetEvent(g_hEvent)为无信号状态;
只有一个实例运行:可以通过创建命名的事件对象,通过ERROR_ALREADY_EXISTS==GetLastError()完成;
关键代码段/临界区对象CriticalSection
全局对象:CRITICAL_SECTION g_cs
初始化:InitializeCriticalSection(&g_cs)
申请所有权:EnterCriticalSection(&g_cs)
释放所有权:LeaveCriticalSection(&g_cs)
清理:DeleteCriticalSection(&g_cs)
死锁:两个临界区对象可以实现死锁:两个线程都在没有释放自己拥有的对象时,申请自己没有的临界区对象;