创建线程的过程整理一下
来源:互联网 发布:淘宝卖家信用卡手续费 编辑:程序博客网 时间:2024/05/29 17:13
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这个函数有些特别,就是在调用这个函数的时候,目标线程会结束,但是目标线程的堆栈不会被清理。
大概就这么多,感觉自己的知识还不够,要学的东西还有很多,路漫漫...
- 作者: 邹晓 访问统计:440 2005年09月16日, 星期五 03:36 加入博采
Trackback
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=2935313
- 创建线程的过程整理一下
- pthread_create线程创建的过程剖析
- pthread_create线程创建的过程剖析
- 3 OSG创建渲染线程的过程
- 进程和线程的创建过程
- OSG创建渲染线程的过程
- pthread_create线程创建的过程剖析
- pthread_create线程创建的过程剖析
- Java 线程池的创建过程分析
- 浅谈一下mySql中创建存储过程
- 整理一下XSLT的优缺点
- 整理一下最近的笔记
- 整理一下自己的态度
- 整理一下最近的Process
- 整理一下现在的状态
- 整理一下最近的研究
- 整理一下自己的实习
- 整理一下js的基础知识
- cocos2d对动画的各种操作
- java集合工具类
- SQLITE3,C语言使用
- Gerrit 在Ubuntu 11.04上的安装与配置
- ubuntu 10.10开机自启动svn服务
- 创建线程的过程整理一下
- 你是否也曾纠结pdf复制到word格式混乱的问题
- OpenCV读取图像_显示图像和保存图像
- Collections 与 Collection 接口的区别
- matlab双击.m文件另外打开一个matlab程序的问题
- 做一个心如止水的程序员
- JAVA判空、null
- 构造/析构/ 赋值运算
- 坐得越久 死得越快 还是站着编程吧