windows笔记-线程的一些性质

调用 CreateThread 可使系统创建一个线程内核对象 。该对象的初始使用计数是 2 (在线程停止运行和从 CreateThread 返回的句柄关闭之前,线程内核对象不会被撤消)。线程的内核对象的其他属性也被初始化,暂停计数 被设置为 1 ,退出代码始终为 STILL_ACTIVE 0x103 ),该对象设置为未通知状态。

一旦内核对象创建完成,系统就分配用于线程的堆栈的内存。 该内存是从进程 的地址空间分配而来的。然后系统将两个值写入新线程的堆栈的上端(线程堆栈总是从内存的高地址向低地址建立)。

写入堆栈的第一个值是传递给 CreateThread pvParam 参数的值。紧靠它的下面是传递给 CreateThread pfnStartAddr 参数的值。

每个线程都有它自己的一组 CPU 寄存器 ,称为线程的上下文。该上下文反映了线程上次运行时该线程的 CPU 寄存器的状态。线程的这组 CPU 寄存器保存在一个 CONTEXT 结构 (在 WinNT. h 头文件中作了定义)中。 CONTEXT 结构本身则包含在线程的内核对象中

指令指针 堆栈指针寄存器 是线程上下文中两个最重要的寄存器。记住,线程总是在进程的上下文中运行的。因此,这些地址都用于标识拥有线程的进程地址空间中的内存。当线程的内核对象被初始化时, CONTEXT 结构的堆栈指针寄存器 被设置为线程堆栈上用来放置 pfnStartAddr 的地址 指令指针寄存器 置为称为 BaseThreadStart 的未文档化(和未输出)的函数的地址中。该函数包含在 Kernel32.dll 模块中(这也是实现 CreateThread 函数的地方)。

线程完全初始化后,系统就要查看 CREATE_SUSPE 标志是否已经传递给 CreateThread 。如果该标志没有传递,系统便将线程的暂停计数递减为 0 该线程可以被调度到一个进程中。然后系统用上次保存在线程上下文中的值加载到实际的 CPU 寄存器中。这时线程就可以执行代码,并对它的进程的地址空间中的数据进行操作。

 

由于新线程的指令指针被置为 BaseThreadStart ,因此该函数实际上是线程开始执行的地方。

 

当新线程执行 BaseThreadStart 函数时,将会出现下列情况:

* 在线程函数中建立一个结构化异常处理( SEH )帧 ,这样,在线程执行时产生的任何异常情况都会得到系统的某种默认处理 .

* 系统调用线程函数,并将你传递给 CreateThread 函数的 pvParam 参数传递给它。

* 当线程函数返回时, BaseThreadStart 调用 ExitThread ,并将线程函数的返回值传递给它。该线程内核对象的使用计数被递减,线程停止执行。

* 如果线程产生一个没有处理的异常条件 ,由 BaseThreadStart 函数建立的 SEH 帧将负责 处理该异常条件。通常情况下,这意味着向用户显示一个消息框,并且在用户撤消该消息框时,

BaseThreadStart 调用 ExitProcess 以终止整个进程的运行 ,而不只是终止线程的运行。

 

       注意 ,在 BaseThreadStart 函数中,线程要么调用 ExitThread ,要么调用 ExitProcess 。这意味着线程不能退出该函数 ,它总是在函数中被撤消。这就是 BaseThreadStart 的原型规定返回 VOID ,而它从来不返回的原因。


本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/09/02/1816088.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值