windows核心编程之线程补充

我们来看下着张结构图
CreateThread函数创建内核对象
这里写图片描述
SP:堆栈指针寄存器
IP:指令指针寄存器(这里待会做详细讲解)
其他CPU寄存器:存放其他若干数据的寄存器
使用次数:至少为1,若打开了线程内核对象,则使用计数会加1
暂停计数:若创建线程的时候使用了CREATE_SUSPEND,则计数从1开始,每次使用SuspendThread都会时暂停计数加1,如果暂停计数为2,那么你就需要使用ResumeThread两次,让暂停计数变为0,才能让该线程处于可调度状态,这样,系统才会为该线程分类CPU时间片
退出代码:用来表明线程是活跃状态还是退出状态
已通知:这个标志一般用于等待函数,比如waitforsingleobject

大多数东西我已经说过,今天要说的是IP指针,你以为这个IP指针存放的是线程函数的地址吗,不是,它存放的是一个BaseThreadStart(未文档化)函数的指针(给这个函数传值的方法时压栈),然后把CreateThread的pvParam参数写入线程的栈中,然后把CreateThread的pfnStartAddr的线程函数地址写入栈中(PS:其实这也是绝大多数函数传递参数的方法)

也就是说,所有的线程(主线程除外)都是从BaseThreadStart开始执行的,主线程的真正的起始执行函数也不是它本身,也是类似于BaseThreadStart的函数
伪代码

void BaseThreadStart(PTHREAD_STRAT_ROUTINE pfnStartAddr,PVOID pvParam)
{
    __try
    {
        ExitThread((pfnStartAddr)(pvParam));
    }
    __except(UnhandledExceptionFilter(GetExceptionInformation()))
    {
        ExitProcess(GetExceptionCode());
    }
}

ExitThread函数等待线程函数返回
这个函数主要是创建了一个结构化异常处理帧,可以对任何情况进行默认处理,同时,保证发生异常时,退出运行(ExitProcess)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值