《Windows核心程式設計》 同步事件

2021-08-17 19:47:11 字數 1597 閱讀 8422

同步物件:

核心中的事件是乙個資料結構,這個結構的指標可以當作乙個引數傳入乙個等待函式中。如果這個事件不被「設定」,則這個等待函式不會返回,這個執行緒被阻塞;如果這個事件被「設定」,則等待結束,執行緒可以繼續執行。

如果乙個執行緒需要等待另乙個執行緒完成某事之後才能做某事,則可以使用事件等待。這個資料結構就是kevent,這個結構總是用keinitializeevent初始化:

void keinitializeevent(

in prkevent event,

in event_type type,

in boolean state

);引數event是要初始化的事件;type是事件型別;引數state是初始化狀態,一般設定為false,也就是未設定狀態,這樣等待執行緒需要等待。注意,事件不需要銷毀。

設定事件使用函式kesetevent:

long kesetevent(

in prkevent event,

//要設定的事件

in kpriority increment,

//用於提公升優先權,可設為0

in boolean wait 

//表示函式後面是否緊接著乙個kewaitsingleobject來等待這個事件,

//一般設定為true(事件初始化後,一般就要開始等待了)

);使用事件的簡單**如下:

//等待乙個事件

kevent

event;//

事件初始化

keinitializeevent(&

event

, synchronizationevent, true);

…-…-

//事件初始化之後就可以使用了,在乙個函式中,我們可以等待某個事件

//如果這個事件沒有被人設定,那就會阻塞在這裡繼續等待

kewaitforsingleobject(&

event

, executive, kernelmode, 0, 0);

…-..

//在另乙個函式或其他地方,設定了這個事件。而一旦設定了這個事件

//前面等待的地方就會開始繼續執行

kesetevent(&

event

);上面**中keinitializeevent中使用了synchronizationevent,導致這個事件成為所謂的「自動重設」事件。乙個事件如果被設定,那麼所有kewaitforsingleobject等待這個事件的地方都會通過。如果要繼續重複使用這個事件,必須重設這個事件。當keinitializeevent第二個引數設定為notificationevent時,這個事件必須要手動重設才能使用。手動重設使用函式:

long keresetevent(

in prkevent event

);上面**中的事件初始化為synchronizationevent事件,因此只有乙個執行緒的kewaitforsingleobject可以通過,通過之後被自動重設,其他的執行緒只能繼續等待,這就是乙個同步事件。

不能起到同步作用的是通知事件(notificationevent),注意,不能用手工設定通知事件的方式來取代同步事件,don』t be stupid, ok?

Windows核心程式設計學習八 事件核心物件

注 原始碼為學習 windows核心程式設計 的一些嘗試,非原創。若能有助於一二訪客,幸甚。檔案 handshake.cpp 描述 學習 windows核心程式設計 當客戶端提交請求到伺服器時觸發的事件核心物件 handle g hevtrequestsubmitted 當伺服器端完成操作返回結果給...

Windows核心程式設計

內容簡介 這是一本經典的windows核心程式設計指南,從第1版到第5版,引領著數十萬程式設計師走入windows開發陣營,培養了大批精英。作為windows開發人員的必備參考,本書是為打算理解windows的c和c 程式設計師精心設計的。第5版全面覆蓋windows xp,windows vist...

windows核心物件執行緒同步

等待函式可使執行緒自願進入等待狀態,直到乙個特定的核心物件變為已通知狀態為止。waitforsingleobject 函式 dword waitforsingleobject handle hobject,dword dwmilliseconds 第乙個引數hobject標識乙個能夠支援被通知 未通...