1. 程式人生 > >事件 訊號量 臨界區 互斥鎖

事件 訊號量 臨界區 互斥鎖

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