线程启动到死亡
- 创建线程的内核对象
- 使用计数,为2
- 暂停计数,是一个UINT类型,这就意味着,一个线程会被暂停多次,当暂停计数为0时,这个线程才将会被执行,为1
- 退出代码,此时的退出代码为STILL_ACTIVE
- Signaled,开始为FALSE
- 栈
- 在栈顶会有lpParam和lpfnAddr
CONTEXT线程上下文结构体,线程上一次运行时的寄存器
- EIP(指令寄存器),指示下一条代码在哪运行,最开始会指向RtlUesrThreadStart(未公开的函数),当调用CreatrThread函数时,CreatrThread会去调用RtlUesrThreadStart函数
- ESP(栈寄存器),指向栈顶,也就是lpfnAddr
暂停计数减1,为0后,交给CPU调度
…
RtlUesrThreadStart
- 设置一个结构化异常SEH
- 调用线程函数,lpParam传入进去
- 等待线程的返回
- 当函数返回时,会调用ExitThread,并把线程函数的返回值给ExitThread函数
- 使用计数减1
_beginthreadex和CreateThread
_beginthreadex,在process.h头文件中,属于纯C/C++多线程运行库
uintptr_t _beginthreadex( // MANAGED CODE