您的位置:首页 > 其它

_beginthreadex调用流程

2016-07-08 00:00 148 查看
摘要: Windows C/C++线程创建

声明:

[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节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息