一、暂停线程的运行:
a) 创建时使用CREATE_SUSPENDED
b) DWORD SuspendThread(HANDLE hThread);
二、恢复执行(唤醒):DWORD ResumeThread(HANDLE hThread);
三、线程睡眠:VOID Sleep(DWORD dwMilliseconds);
四、转换到其他线程:BOOL SwitchToThread();
五、线程的运行时间:
a) 使用两个GetTickCount()计算时间差不可取;
b) BOOL GetThreadTimes(
HANDLE hThread,
PFILETIME pftCreationTime, //绝对值,创建时间,1601-1-1
PFILETIME pftExitTime, //绝对值,退出时间,1601-1-1
PFILETIME pftKernelTime, //相对值,线程执行OS代码使用CPU时间
PFILETIME pftUserTime); //相对值,线程执行程序代码使用CPU时间
均使用100ns的时间间隔。
c) QueryPerformanceCounter(见SchedLab)
六、查看线程内核对象的结构环境(CPU状态):CONTEXT
a) CONTEXT组成部分(右ContextFlags标记):
1.CONTEXT_CONTROL:控制寄存器(指令指针、堆栈指针、标志、函数返回地址;
2.CONTEXT_INTEGER:整数寄存器;
3.CONTEXT_FLOATING_POINT:浮点寄存器
4.CONTEXT_SEGMENTS:段寄存器
5.CONTEXT_DEBUG_REGISTER:调试寄存器;
6.CONTEXT_EXTENDED_REGISTER:扩展寄存器
7.CONTEXT_FULL:所有重要寄存器
b) 查看:BOOL GetThreadContext(HANDLE, PCONTEXT);
c) 设置:BOOL SetThreadContext(HANDLE, CONST CONTEXT*);
d) 调用前先挂起线程:SuspendThread(HANDLE);
七、优先级
a) 线程在CreateProcess时在fdwCreate传递优先级;
b) 设置进程优先级:BOOL SetPriorityClass(HANDLE, DWORD);
c) 查看进程优先级:DWORD GetPriorityClass(HANDLE);
d) 设置线程优先级(创建时无参数传递):BOOL SetThreadPriority(HANDLE, int nPriority);
e) 查看线程优先级:int GetThreadPriority(HANDLE);
f) 避免系统提高优先级:
进程BOOL SetProcessPriorityBoost(HANDLE, BOOL);
线程BOOL SetThreadPriorityBoost(HANDLE, BOOL);
g) 查看是激活或停用优先级提高功能:
BOOL GetProcessPriorityBoost, GetThreadPriorityBoost
h) 在控制台启动时可设置优先级,eg:C:/>START /LOW CALC.EXE
i) WIN2000在任务管理器设置;
八、亲缘性(在多CPU多内存的情况下,NUMA)
a) 可以指定进程在哪个CPU上运行:BOOL SetProcessAffinityMask(HANDLE, DWORD_PTR dwProcessAffinityMask);
b) 查询进程亲缘性位屏蔽:BOOL GetProcessAffinityMask(HANDLE, PDWORD_PTR, PDWORD_PTR);
c) 设置线程亲缘性:DWORD_PTR SetThreadAffinityMask(HANDLE, DWORD_PTR);
d) 为线程设置首选的CPU:DWORD SetThreadIdealProcessor(HANDLE, DWORD dwIdealProcessor);
e) 在EXE文件头上设置CPU亲缘性,p.29(可以使用LOAD IMAGE方法;或ImageCfg.exe);
f) 在任务管理器上修改(多CPU时);