_beginthreadex调用流程
2016-07-08 00:00
148 查看
摘要: Windows C/C++线程创建
声明:
解析:
a. 创建并初始化ptidata数据块,把传递过来的start_address、arglist保存到这个数据块中。
b. 调用CreateThread创建线程,传递的线程函数为_threadstartex,参数为ptidata的指针。
c. 系统创建线程,把BaseThreadStart的地址放入线程指令指针寄存器,线程从此处执行。
d. _threadstartex作为线程函数被调用。
e. 先调用TlsSetValue把ptidata关联到线程中。
f. 调用ptidata中保存的用户传递进来的线程函数。
g. 用户线程函数执行完成后调用_endthreadex。
h. 调用ExitThread终止线程,线程的运行到这里就结束了,_threadstartex函数不会返回。
i. 不会执行到这里。
BaseThreadStart和_threadstartex几乎一样,只是多了对ptidata的操作。同样,_endthreadex比ExitThread多了对ptidata的清理。
参考:
《Windows核心编程》第6章 线程的基础知识 6.6、6.7节
声明:
[code=language-cpp]unsigned long _beginthreadex( void *security, unsigned stack_size, unsigned (__stdcall *start_address)(void *), void *arglist, unsigned initflag, unsigned *thrdaddr );
解析:
[code=language-python]_beginthreadex init ptidata # a CreateThread # b BaseThreadStart # c _threadstartex # d associate ptidata to thread # e call thread function # f _endthreadex # g ExitThread # h ExitThread # i
a. 创建并初始化ptidata数据块,把传递过来的start_address、arglist保存到这个数据块中。
b. 调用CreateThread创建线程,传递的线程函数为_threadstartex,参数为ptidata的指针。
c. 系统创建线程,把BaseThreadStart的地址放入线程指令指针寄存器,线程从此处执行。
d. _threadstartex作为线程函数被调用。
e. 先调用TlsSetValue把ptidata关联到线程中。
f. 调用ptidata中保存的用户传递进来的线程函数。
g. 用户线程函数执行完成后调用_endthreadex。
h. 调用ExitThread终止线程,线程的运行到这里就结束了,_threadstartex函数不会返回。
i. 不会执行到这里。
BaseThreadStart和_threadstartex几乎一样,只是多了对ptidata的操作。同样,_endthreadex比ExitThread多了对ptidata的清理。
参考:
《Windows核心编程》第6章 线程的基础知识 6.6、6.7节
相关文章推荐
- _beginthreadex参数说明和CreateThread之间对比
- CreateThread, AfxBeginThread,_beginthread, _beginthreadex线程函数区别
- 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
- 并发编程学习总结(一) :java 创建线程的三种方式的优缺点和实例
- _beginthreadex()和CreateThread()的区别 为什么不用_beginthread()?
- Java线程
- Windows编程-线程的创建
- 处理线程的函数
- JAVA学习笔记(三十七)- 创建继承Thread的线程
- 【程序设计】CreateThread()与_beginthreadex()的区别
- 看《_beginthreadex和CreateThread的区别和联系》的补遗
- 给线程取名
- Java中创建线程的两种方式
- 线程创建(1)
- java多线程系列01——多线程基础
- Java创建线程的两个方法
- 线程创建与等待
- Java总结(九)——(线程模块 一(线程的创建(方法一)与启动,线程状态与生命周期,进程与线程))
- 二、创建线程的几种方式
- Java 多线程的详解