多執行緒同步互斥的四個實現方法圖
阿新 • • 發佈:2018-12-31
一、引言
這篇文章記錄是來源於Windows多執行緒系列的學習筆記,表為原創,實為轉載文章,只是為了讓自己學的明白,稍微整理了下而已,在此向“MoreWindows”大神致敬!
二、關鍵段與互斥量Mutex
名稱 | 建立或初始化 | 銷燬 | 進入互斥區域 | 離開互斥區域 |
---|---|---|---|---|
關鍵段CS | InitializeCritialSection | DeleteCriticalSection | EnterCriticalSection | LeaveCriticalSection |
互斥量Mutex | CreateMutex | CloseHandle | 等待系列函式如WaitForSingleObject | ReleaseMutex |
關鍵段與互斥量都有“執行緒所有權”概念,可以將“執行緒所有權”理解成旅館的房卡,在旅館前臺登記名字擁有房卡後是可以多次進出房間的,其它人則無法進入直到你交出房卡。每個執行緒必須先通過EnterCriticalSection或WaitForSingleObject來嘗試獲得“執行緒所有權”才能呼叫LeaveCriticalSection或ReleaseMutex。否則會呼叫失敗,這就相當於偽造房卡去辦理退房手續——由於登記本上沒有你的名字所以會被拒絕。
三、事件Event
名稱 | 建立 | 銷燬 | 使事件觸發 | 使事件未觸發 |
---|---|---|---|---|
事件Event | CreateEvent | CloseEvent | SetEvent | ResetEvent |
注意事件的手動置位和自動置位要分清楚,不要混淆了
四、訊號量Semaphore
名稱 | 建立 | 銷燬 | 遞減計數 | 遞增計數 |
---|---|---|---|---|
訊號量Semaphore | CreateSemaphore | CloseHandle | 等待系列函式如WaitForSingleObject | ReleaseSemaphore |
訊號量在計數大於0時表示觸發狀態,呼叫WaitForSingleObject不會阻塞,等於0表示未觸發狀態,呼叫WaitForSingleObject會阻塞知道有其它執行緒遞增了計數