「编程」 多线程同步核心代码Mutex和Event

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系列函数才会返回


分享到:


相關文章: