上下文转换:每隔2 0 m s左右,Windows要查看当前存在的所有线程内核对象。在这些对象中,只有某些对象被视为可以调度的对象。Windows选择可调度的线程内核对象中的一个,将它加载到 CPU的寄存器中,它的值是上次保存在线程的环境中的值。这项操作称为上下文转换。
一、暂停和恢复线程的运行
A: 在线程内核对象的内部有一个值,用于指明线程的暂停计数。
当调用 CreateProcess或CraeThread创建线程的内核对象,暂停计数被初始化为 1(防止线程被调度到CPU中,因线程的初始化需要时间)。线程完全初始化之后,CreateProcess或CraeThread查看是否已经传递了CREATE_SUSPENDED标志。若已经传递,则函数就返回同时新线程处于暂停状态。如果尚未传递,那么该函数将线程的暂停计数递减为 0。(暂停计数是0的时,除非线程等待其他某种事情的发生,否则该线程就处于可调度状态)。
在暂停状态中创建一个线程,在线程执行代码之前改变其运行环境(如优先级)。一旦改变了线程的环境,必须使线程成为可调度线程。
B: DWORD
ResumeThread (HANDLE hThread);
CraeThread函数返回的线程句柄传递给它(或将传递给CreateProcess的ppiProcInfo参数指向的线程句柄传递给它), 成功则返回线程的前一个暂停计数,否则返回0 x F F F F F F F F。
DWORD SuspendThread (HANDLE hThread);
返回线程的前一个暂停计数。任何线程都可以调用该函数来暂停另一个线程的运行(只要拥有线程的句柄)。SuspendThread与内核方式的执行是异步进行的,但是在线程恢复运行之前,不会发生用户方式的执行。(只有知道目标线程是什么(或正在做什么)并采取强有力的措施来避免因暂停线程的运行而带来的问题或死锁状态,SuspendThread才是安全的)。
C:线程可以自行暂停运行但是不能自行恢复运行,一个线程暂停N次必须恢复N次后才能分配CPU时间。