概述
同步对象:
内核中的事件是一个数据结构,这个结构的指针可以当作一个参数传入一个等待函数中。如果这个事件不被“设置”,则这个等待函数不会返回,这个线程被阻塞;如果这个事件被“设置”,则等待结束,线程可以继续执行。
如果一个线程需要等待另一个线程完成某事之后才能做某事,则可以使用事件等待。这个数据结构就是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内核编程》---同步事件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复