作用
当线程1需要等待线程2处理一些事情的时候就用到这种线程同步机制
知识点
1、事件,信号灯,互斥体都是线程之间通讯的方式,事件的通讯能满足大部分需求。
2、休眠函数
LARGE_INTEGER sleeptime = {
0};//定义一个休眠的时间
sleeptime.QuadPart = -100 * 10 * 100 * 3;//这里是3秒时间
while (1)
{
//这个函数相当于R3程序的 Sleep 让线程休眠
KeDelayExecutionThread(KernelMode, FALSE, &sleeptime);//线程休眠3秒钟
}
3、内核线程例程 需要添加
PsTerminateSystemThread(0);
否则即使代码全部运行完毕,这个内核线程也不会结束。
4、如果一个事件被设置为通知事件NotificationEvent
KeInitializeEvent(&gkevent,NotificationEvent,FALSE);
,那么当这个事件被设置成激发态以后,如果还需要用到这个事件进行同步,那么需要开发人员手动设置为不激发状态!设置的代码KeResetEvent(&gkevent);,一般只使用一次就用这种
5、如果某个事件设置为同步事件SynchronizationEvent
那么当这个事件遇到KeWaite等待通过然后系统会自动将事件重置为未激发态
内核层线程与内核层的同步
实际就是线程1等待线程2处理完一些事情,线程1在继续做其它事情
全局定义:
KEVENT gkevent = {
0 };//线程同步用的数据结构,同步就靠这个结构,这个很重要
BYTE mmcode[10] = {
0};//这个是演示内存线程之间同步数据用的
线程1:
这个线程从入口函数启动,这个函数会启动线程二
在这里插入代码片
/// <summary>
/// 内核线程1
/// </summary>
/// <param name="context"></param>
VOID kernelThread1(PVOID context)
{
//&gkevent 线程同步用的数据结构的指针
//参数2 事件 NotificationEvent是一种通知事件,只执行一次,需要手动恢复;SynchronizationEvent是同步事件,系统自动恢复通知
//参数3 是否为激发态
//KeInitializeEvent(&gkevent,NotificationEvent,FALSE);
KeInitializeEvent(&gkevent, SynchronizationEvent, FALSE);//这种系统会自动重置未激发态
HANDLE hthread = NULL;
//创建一个系统线程
//参数1 &hthread是句柄指针
//参数2 是访问控制码,一般是设置0 ,是全部权限
//参数3 NULL 是描述符
//参数4是我们这个线程所属的进程句柄
//参数5结果指针
//参数6 kernelThread2 需要创建的线程进程含函数,这个函数是自己写的
//最后一个参数是 ,参数6函数 的参数
NTSTATUS status = PsCreateSystemThread(&hthread, 0, NULL, NULL, NULL, kernelThread2, (PVOID)&gkevent);
ZwClose(hthread); //关闭句柄
while (1)
{