「編程」 多線程同步核心代碼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系列函數才會返回


分享到:


相關文章: