c runtime library对多线程的支持- -
Tag: 多线程 runtime library先把创建线程的过程整理一下:
调用CreateThread后,系统就会创建一个线程内核对象,然后在进程内分配线程使用的堆栈的内存。然后将CreateThread中的pvParam和pfnStartAddrj放入堆栈。内核对象中的CONTEXT(上下文)结构中的Stack Pointer(SP)指向该堆栈(这时应该指向的是pfnStartAddrj)。CONTEXT中的Instruction Pointer(IP)指向代码的开始点,这个开始点是在kernel32.dll中的BaseThreadStart这个函数。这个函数会建立一个结构化处理帧来处理线程产生的异常,它会调用我们的线程函数,而且在线程函数返回时调用ExitThread函数。
runtime library对多线程的支持,原因按照书上的说法主要是处于对runtime library的全局变量的考虑,对每个线程都保留一份单独的data block。书上列举的那些代码看得我脑壳大,很多都不懂,不过大概的意思还是明白。首先_beginthreadex创建一个data block并初始化,并且调用CreateThread函数,将pfnStartAddrj(起点函数)指向_threadstartex,pvParam(起点函数的参数)指向那个data block。
_threadstartex也是runtime library中的一个函数,主要功能是:将data block和这个线程关联起来,然后创建结构化处理帧来处理异常,然后调用我们自己写的线程函数,最后在线程函数返回时调用_endthreadex。_endthreadex跟ExitThread差不多,不过它会回收data block占用的那存。
有个问题是关于_threadstartex的,就是其实_threadstartex跟BaseThreadStart这个函数的作用很相似,相比较而言好像BaseThreadStart只是没有把参数跟线程关联起来而已。我在想为什么不直接把_threadstartex写入BaseThreadStart呢?这个问题一直没想通。
Jeffrey(书作者)的忠告:最好是用_threadstartex,不到万不得已的时候千万不要直接用CreateThread
顺便说一句,TerminateThread这个函数有些特别,就是在调用这个函数的时候,目标线程会结束,但是目标线程的堆栈不会被清理。
大概就这么多,感觉自己的知识还不够,要学的东西还有很多,路漫漫...