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系列函數才會返回
閱讀更多 攻防基地 的文章