Mutex对象:
在不被任何线程拥有时是有信号的,而在某个线程拥有时是无信号的(Mutex被线程拥有就是某个线程用Wait系列函数等待后,成功返回)
Mutex用法:
HANDLE WINAPI CreateMutex(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
_In_ BOOL bInitialOwner,
_In_opt_ LPCTSTR lpName
);
1.使用CreateMutex创建Mutex对象得到句柄
2.使用等待函数族等待Mutex,等待成功时调用等待函数的线程就具有了该Mutex的控制权
3.执行被控制的代码段(函数\\过程等)
4.调用ReleaseMutex释放Mutex对象控制权
5.最后使用CloseHandle关闭Mutex对象句柄
Event对象:
通过SetEvent或PulseEvent函数设置成有信号状态,其他情况下是无信号的
Event可以创建为手工重置状态或自动重置状态的
手工重置的Event在有信号状态之后程序主动调用ResetEvent之前一直都是有信号状态的
自动重置的Event当有信号状态在唤醒至少一个等待这个Event的线程之后,立刻变成无信号状态,如果没有线程等待这个Event那么它将一直有信号
Event用法:
HANDLE WINAPI CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
1、使用CreateEvent创建一个Event对象取得句柄
2、传递给需要等待的线程,并由其调用等待函数族等待这个Event
3、调用SetEvent唤醒等待该Event的线程
4、最后使用CloseHandle关闭这个Event
特点区别:
Mutex对象在Create的时候是有信号的,此时他
Event对象
PS:当且仅当同步对象有信号的时候,Wait系列函数才会返回
閱讀更多 攻防基地 的文章