事件 訊號量 臨界區 互斥鎖
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全屬性
BOOL bManualReset,// 復位方式
BOOL bInitialState,// 初始狀態 FALSE建立時為未通知狀態 TRUE建立時為已通知狀態
LPCTSTR lpName // 物件名稱
);
bManualReset 為TRUE時,WaitForSingleObject(hEvent, INFINITE)時,hEvent事件變為已通知狀態後並不會改變hEvent的狀態,即如果有多個執行緒同時等待hEvent,那麼多個執行緒都會等待hEvent,
我們必須通過ResetEvent函式來手工將事件的狀態復原到未通知狀態。
bManualReset為FALSE時,WaitForSingleObject(hEvent, INFITINE)呼叫結束後,hEevent的事件會恢復為未通知狀態,如果需要其他執行緒能夠得到通知, 需要呼叫SetEvent函式再次將hEvent的狀態變為已通知狀態。
臨界區 互斥鎖 一個是核心物件 一個是使用者物件
互斥鎖 事件 訊號量可以跨程序使用
事件當bManualReset置為FALSE時,與互斥鎖類似,
當bManualReset置為TRUE時,阻塞的所有執行緒都會被喚醒
訊號量可以通過lInitialCount的值 更加靈活的控制多個執行緒的同步
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全屬性指標
LONG lInitialCount, // 初始計數 為0表示不傳送訊號 IIntialCount <= IMaximumCount
LONG lMaximumCount, // 最大計數
LPCTSTR lpName // 物件名指標
);
DWORD WaitForSingleObject(
HANDLE hObject;
DWORD dwMilliseconds;
);
WaitForSingleObject(hSeamphore, INFINITE); //如果 lInitialCount為0 該函式為阻塞 呼叫該函式會導致 lInitialCount -1
BOOL ReleaseSemaphore(
HANDLE hSemaphore, // 訊號量控制代碼
LONG lReleaseCount, // 計數遞增數量
LPLONG lpPreviousCount // 先前計數
);
ReleaseSemaphore(hSemaphore, 1, NULL) //呼叫該函式會導致 lInitialCount -1