内核线程之间的同步,R3线程和内核线程的同步

本文介绍了内核线程之间的同步机制,包括事件、信号灯、互斥体等通讯方式。重点讲解了内核层线程如何与应用层线程进行同步,例如通过事件对象进行交互,以及在不同场景下的执行流程。同时,提供了应用层R3代码示例,展示了如何设置事件并触发内核层线程的执行,从而实现内核与应用层的同步打印信息。
摘要由CSDN通过智能技术生成

作用

当线程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)
	{
   
		
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值