线程内核对象

来源:互联网 发布:mysql 日志文件 编辑:程序博客网 时间:2024/04/30 16:20
  • 函数调用,函数调用,通常都是这样说的。其实函数也可以不“调用”,只要把cpu的指令指针指向函数入口地址,把参数放到合适的地址,并把该地址放到堆栈指针,函数就执行起来了。
    这 正是CreateThread的工作方式。指令指针指向一个叫做BaseThreadStart的函数,该函数的参数则是由操作系统负责放到其堆栈,然后 设置好堆栈指针。BaseThreadStart即运行起来,而不通过任何函数“调用”,所以该函数从来不返回,直接在函数内就ExitThread。
  • GetCurrentProcess和GetCurrentThread返回的都是伪句柄,它总是调用函数的进程或线程的句柄。如果调用CloseHandle,并传递伪句柄做参数,那么CloseHandle会不做任何操作,返回FLASE。
    要把伪句柄转换为实句柄,可以通过调用DuplicateHandle来复制一个句柄,但是复制出来的句柄是真实存在在句柄表中的一个核心对象,是一个实句柄。
  • 调用SuspendThread任何线程都可以挂起另一个线程的运行(只要拥有线程句柄)。线程可以自行挂起,但是不能自行恢复。
  • 调用Sleep(0)与调用SwitchToThread()的相似之处是调用线程都会自愿放弃它剩余的时间片,让CPU去调度其他线程。差别是,SwitchToThread允许优先级比它低的线程被调度,但是Sleep只能让优先级不比自己低的线程被调度。
  • Windows定义的所有数据结构中,线程CONTEXT(上下文)是特定于CPU的惟一数据结构。该结构最重要的成员是ContextFlags,可以初始化为CONTEXT_CONTROL(表示要查询控制寄存器)等。
    函数GetThreadContext可以查看线程内核对象的内部情况,抓取它当前的一组cpu寄存器,但只能返回线程的用户方式环境,不能返回内核方式环境。
    调用上述函数之前要先挂起线程。对应也有一个SetThreadContext函数。
 
原创粉丝点击