一、暂停计数
在线程内核对象的内部有一个值,用于指明线程的暂停计数。当调用CreateProcess或CreateThread函数时,就创建了线程的内核对象,并将暂停计数初始化为1,防止被CPU调度。在线程初始化好之后,如果有CREATE_SUSPENDED标志,就退出创建函数。否则,将暂停计数递减为0.
二、恢复运行
DWORD ResumeThread(HANDLE hThread);成功:返回前一个暂停计数,否则返回0xFFFFFFFF。
单个线程可以暂停若干次,若果一个线程暂停了3次,它必须恢复3次,才可以被CPU调度。
三、暂停运行
DWORD SuspendThread(HANDLE hThread);返回的是线程的前一个暂停计数。线程暂停的最多次数可以是MAXIMUM_SUSPEND_COUNT次。
四、睡眠方式
VOID Sleep(DWORD dwMilliseconds);
n 调用Sleep,可使线程自愿放弃它剩余的时间片。
n 系统将在大约的指定毫秒数内使线程不可调度。
n 可以传递INFINITE参数,最好不要这样用,应退出线程,并还原它的堆栈和内核对象。
n 可以传递0,这将告诉系统,调用线程将释放剩余的时间片。
五、转换到另一个线程
BOOL SwitchToThread();
当调用这个函数的时候,系统要查看是否存在一个迫切需要C P U时间的线程。如果没有线程迫切需要C P U时间,S w i t c h To T h r e a d就会立即返回。如果存在一个迫切需要C P U时间的线程,S w i t c h To T h r e a d就对该线程进行调度(该线程的优先级可能低于调用S w i t c h To T h r e a d的线程)。这个迫切需要C P U时间的线程可以运行一个时间段,然后系统调度程序照常运行。
该函数允许一个需要资源的线程强制另一个优先级较低、而目前却拥有该资源的线程放弃该资源。如果调用S w i t c h To T h r e a d函数时没有其他线程能够运行,那么该函数返回FA L S E,否则返回一个非0值。
调用S w i t c h To T h r e a d函数与调用S l e e p是相似的,并且传递给它一个0 m s的超时。差别是S w i t c h To T h r e a d允许优先级较低的线程运行。即使低优先级线程迫切需要C P U时间,S l e e p也能够立即对调用线程重新进行调度。
六、线程运行时间
BOOL GetThreadTimes(HANDLE hThread,
PFILETIME pftCreationTime,
PFILETIME pftExitTime,
PFILETIME pftKernelTime,
PFILETIME pftUserTime);
七、线程的优先级
每个线程都会被赋予一个从0(最低)到31(最高)的优先级号码。
高优先级线程将抢在低优先级线程之前运行,不管低优先级线程正在运行什么。例如,如果一个优先级为5的线程正在运行,系统发现一个高优先级的线程准备要运行,那么系统就会立即暂停低优先级线程的运行(即使它处于它的时间片中),并且将C P U分配给高优先级线程,使它获得一个完整的时间片。还有,当系统引导时,它会创建一个特殊的线程,称为0页线程。该线程被赋予优先级0,它是整个系统中唯一的一个在优先级0上运行的线程。当系统中没有任何线程需要执行操作时,0页线程负责将系统中的所有空闲R A M页面置0。
八、Windows支持6个优先级类:空闲、低于正常、正常、高于正常、高和实时(THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_HIGHEST和THREAD_PRIORITY_TIME_CRITICAL)。
九、设置和获得线程的相对优先级
当一个线程刚刚创建时,它的相对优先级总是设置为正常优先级。CreateThread没有为调用者提供一个设置新线程的相对优先级的方法。
BOOL SetThreadPriority(HANDLE hThread, int nPriority);
int GetThreadPriority(HANDLE hThread);
十、关闭线程句柄
关闭线程句柄并不是结束或移除线程对象。
十一、亲缘性
按照默认设置,当系统将线程分配给处理器时, Windows 2000使用软亲缘性来进行操作。这意味着如果所有其他因素相同的话,它将设法在它上次运行的那个处理器上运行线程。让线程留在单个处理器上,有助于重复使用仍然在处理器的内存高速缓存中的数据。
Windows 2000允许设置进程和线程的亲缘性。换句话说,可以控制哪个C P U能够运行某些线程。这称为硬亲缘性。
BOOL SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask);
hProcess:指明要影响的是哪个进程
dwProcessAffinityMask:位屏蔽,指明线程可以在哪些CPU上运行。
注意,子进程可以继承进程的亲缘性。
BOOL GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR pdwProcessAffinityMask, PWORD_PTR pdwSystemAffinityMask);
DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);
线程的亲缘性屏蔽必须是进程的亲缘性屏蔽的相应子集。
DWORD SetThreadIdealProcessor(HANDLE hTread, DWORD dwIdealProcessor);
dwIdealProcessor函数不是个位屏蔽函数,而是一个整数,用于指明供线程使用的首选CPU。
十二、CONTEXT结构包含了特定处理器的寄存器数据。
BOOL GetThreadContext(HANDLE hThread, PCONTEXT pContext);在调用前应先调用SuspendThread,否则线程可能被调度。
BOOL SetThreadContext(HANDLE hThread, CONST CONTEXT *pContext);