zoukankan      html  css  js  c++  java
  • windows笔记线程的一些性质

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

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

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

    每个线程都有它自己的一组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

     


  • 相关阅读:
    Remove Element
    C++ 一些STL
    Two Pointers/hash/3Sum/4Sum类题目
    动态规划
    UVa 12657 双向链表
    并行运行环境
    多线程编程
    HTML XML CSS JS 迅速学习
    UVa 11988 数组模拟链表
    静态链表
  • 原文地址:https://www.cnblogs.com/fangyukuan/p/1816088.html
Copyright © 2011-2022 走看看