使用事件通知
一些讀者可能熟悉「事件驅動」程式設計技術。但是這裡的「事件」與之不同。核心中的事件是乙個資料結構。這個結構的指標可以當作乙個引數傳入乙個等待函式中。如果這個事件不被「設定」,則這個等待函式不會返回,這個執行緒被阻塞。如果這個事件被「設定」,則等待結束,可以繼續下去。
這常常用於多個執行緒之間的同步。如果乙個執行緒需要等待另乙個執行緒完成某事後才能做某事,則可以使用事件等待。另乙個執行緒完成後設定事件即可。
這個資料結構是kevent。讀者沒有必要去了解其內部結構。這個結構總是用keinitlizeevent初始化。這個函式原型如下:
void
keinitializeevent(
in prkevent event,
in event_type type,
in boolean state
);第乙個引數是要初始化的事件。第二個引數是事件型別,這個詳見於後面的解釋。第三個引數是初始化狀態。一般的說設定為false。也就是未設狀態。這樣等待者需要等待設定之後才能通過。
事件不需要銷毀。
設定事件使用函式kesetevent。這個函式原型如下:
long
kesetevent(
in prkevent event,
in kpriority increment,
in boolean wait
);event是要設定的事件。increment用於提公升優先權。目前設定為0即可。wait表示是否後面馬上緊接著乙個kewaitsingleobject來等待這個事件。一般設定為true。(事件初始化之後,一般就要開始等待了。)
使用事件的簡單**如下:
// 定義乙個事件
kevent event;
// 事件初始化
keinitializeevent(&event,synchronizationevent,true);
……// 事件初始化之後就可以使用了。在乙個函式中,你可以等待某
// 個事件。如果這個事件沒有被人設定,那就會阻塞在這裡繼續
// 等待。
kewaitforsingleobject(&event,executive,kernelmode,0,0);
……// 這是另乙個地方,有人設定這個事件。只要一設定這個事件,
// 前面等待的地方,將繼續執行。
kesetevent(&event);
由於在keinitializeevent中使用了synchronizationevent,導致這個事件成為所謂的「自動重設」事件。乙個事件如果被設定,那麼所有kewaitforsingleobject等待這個事件的地方都會通過。如果要能繼續重複使用這個時間,必須重設(reset)這個事件。當keinitializeevent中第二個引數被設定為notificationevent的時候,這個事件必須要手動重設才能使用。手動重設使用函式
keresetevent。
long
keresetevent(
in prkevent event
);如果這個事件初始化的時候是synchronizationevent事件,那麼只有乙個執行緒的kewaitforsingleobject可以通過。通過之後被自動重設。那麼其他的執行緒就只能繼續等待了。這可以起到乙個同步作用。所以叫做同步事件。不能起到同步作用的是通知事件(notificationevent)。請注意不能用手工設定通知事件的方法來取代同步事件。請讀者思考一下這是為什麼。
static kevent s_event;
// 我的執行緒函式。傳入乙個引數,這個引數是乙個字串。
void mythreadproc(pvoid context)
// 生成執行緒的函式:
void myfunction()
zwclose(thread);
// 等待事件結束再返回:
kewaitforsingleobject(&s_event,executive,kernelmode,0,0);
}
本期核心事件 第三屆ChinaJoy
數字家庭 健康娛樂 2005 chinajoy焦點透視 7月20日,中國國際數碼互動娛樂產業高峰論壇在上海舉行。對於第三屆中國國際數碼互動娛樂產品及技術應用展覽會 簡稱chinajoy 來說,來自這個論壇的聲音,透露出 對遊戲產業的態度 國內廠商對遊戲產業發展前景的預期和各類投資者試圖涉足中國遊戲產...
Supervisor事件通知
supervisor事件通知,支援郵件,slack,webhook supervisor是 nix環境下的程序管理工具,可以把前台程序轉換為守護程序,當程序異常退出時自動重啟.supervisor event listener監聽程序異常退出事件,並傳送通知.supervisor event lis...
13 事件通知
dubbo提供了oninvoke onreturn onthrow3個事件 oninvoke 呼叫之前執行,如果被呼叫的服務有引數,那麼oninvoke也必要有和被呼叫服務一樣的引數 onreturn 呼叫之後執行,至少有乙個入參,第乙個入參是返回值,其餘是呼叫服務的引數 onthrow 丟擲異常後...