1. 程式人生 > >VC之 執行緒同步之事件物件(Event)

VC之 執行緒同步之事件物件(Event)

事件物件也是核心物件,它也包含三個成員:使用計數、指明事件是自動重置事件還是一個人工重置事件的布林值、指明事件是處於已通知狀態還是處於未通知狀態。

人工重置的事件物件:當人工重置的事件物件得到通知時,等待該事件物件的所有執行緒均變為可排程執行緒。

                    在擁有事件物件的所有權之後要呼叫ResetEvent函式手動地將事件物件重置為無訊號

                 狀態

自動重置的事件物件:當一個自動重置的事件物件得到通知時,等待該事件物件的執行緒中只有一個執行緒變為可

                    排程執行緒。當執行緒得到事件物件的所有權之後,系統會自動將該物件設定為無訊號狀

                  態。

建立事件物件:

     HANDLE CreateEvent(
                   LPSECURITY_ATTRIBUTES lpEventAttributes,// pointer to security attributes
                   BOOL bManualReset,  // flag for manual-reset event
                   BOOL bInitialState, // flag for initial state
                   LPCTSTR lpName      // pointer to event-object name
                     );

    第一個引數如果為NULL表明使用預設的安全性。

    第二個引數指明是人工重置事件物件還是自動重置事件物件,TRUE為人工重置事件物件,FALSE為自動重置

    第三個引數指明事件物件的初始狀態,如果為TRUE表明事件物件初始是有訊號狀態,否則無訊號狀態。

    第四個引數是事件物件的名稱

    判斷建立的事件物件是否已經存在同樣是呼叫GetLastError()函式判斷。

設定事件物件為有訊號狀態:SetEvent()表明將事件物件設定為有訊號狀態。

設定事件物件為無訊號狀態:ReSetEvent()表明將事件物件設定為無訊號狀態。

請求事件物件:WaitForSingleObject(HANDLE,DOWRD)與互斥物件一樣。只有當事件物件為有訊號狀態時該函式才會返回並執行以下語句,且之後要同時將事件物件設定為無訊號狀態,這樣別的執行緒才不能擁有事件物件,在保護的程式碼完成之後再重新將事件物件設定為有訊號狀態,這樣其它執行緒才有機會獲得擁有權。

ReSetEvent和SetEvent是要成對出現的。

人工事件物件:ReSetEvent要手動呼叫。

自動事件物件:ReSetEvent不要手動呼叫,系統會在WaitForSingleObject之後自動將事件設定為無訊號狀態。

事件物件和互斥物件同樣存在一個陷阱:即在建立事件物件的時候如果開始就設定無訊號狀態,則如果要想讓其它執行緒有機會得到擁有權就要將事件物件設定為有訊號狀態即呼叫SetEvent函式.


感謝http://blog.sina.com.cn/s/blog_83b3bb460100u7bv.html