1. 线程的执行时间
一个能够返回线程已获得CPU时间量的函数 :GetThreadTimes(),
要获取高精度的性能函数:QueryPerformanceFrequency()、QueryPerformanceCounter()
2.在实际上下文中谈CONTEXT结构
系统使用CONTEXT结构记住线程的状态,这样线程在下一次获取CPU运行时间时,就可从上一次停止的地方开始执行。CPU上每个寄存器都有一个对应的数据成员,在x86计算机上,数据成员就是Eax,Ebx,Ecx,Edx等。
查看线程内核对象的当前CPU寄存器状态: GetThreadContext(); 在调用GetThreadContext前应该调用SusendThead,否则系统可能正好获得调度此线程的上下文。一个线程有两个上下文,用户模式和内核模式。GetThreadContext只能返回线程的用户模式上下文,如果调用SusendThread暂停一个线程,但该线程正在内核模式执行,那么它的用户模式上下文保持不变。
3.线程优先级
在调度程序给另一个可调度线程分配CPU之前,CPU可运行一个线程大约20ms,这是所有线程优先级都相同时的情况。每个线程都被赋予0~31的优先级数,当系统 确定给哪个线程分配CPU时,它会首先查看优先级为31的线程,并以循环的方式进行调度。
只要有优先级为31的线程可供调度,系统 就不会给优先级0~30的线程分配CPU,这种情况称为饥饿。任何时刻系统 中大多数线程都是不可调度的,例如,如果 进程的主线程调用了GetMessage,而系统看到并没有消息等待处理,系统就会暂停这个线程,取消这个线程当前时间片的剩余时间,并立即 将CPU分配给另一个等待中的线程。如果没有消息出现,供GetMessage获取,进程的主线程将一直被暂停,得不到CPU。但,一旦消息进入线程的队列, 系统 会知道主线程不应该暂停了,如果没有较高优先级的线程需要执行,系统 将给它分配CPU。