在Windows中,每个线程都与一个优先级设置相关。线程的优先级决定了线程接收的CPU时间的多少。低优先级的线程接收比较少的时间,高优先级的线程接收比较多的时间。当然,线程接收的CPU时间的多少对于它的执行性能以及它与系统中当前执行的其他线程之间的交互有着深远的影响。
在Windows中,线程优先级的设置是两个值的组合:进程总体的优先级类别以及相对于这个优先级类别的各个线程的优先级设置。也就是说,线程实际的优先级由进程的优先级类别和各个线程的优先级的组合来确定。
优先级的类别
在默认情况下,进程具有普通的优先级类别,大多数程序在其执行的声明周期内保持这个普通的优先级类别。尽管在本章的示例中没有改变优先级类别,但是为了完整起见,在此给出了线程优先级类别的简单概况。
Windows定义了6个优先级类别,相应的值以从高到低的顺序显示如下:
REALTIME_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
在默认情况下,程序的优先级类别为NORMAL_PRIORITY_CLASS。通常,您不需要改变程序的优先级类别。事实上,改变进程的优先级类别对于整个计算机系统的性能会有负面的影响。例如,如果您将一个程序的优先级类别增加到REALTIME_PRIORITY_CLASS,它就会支配CPU。对于某些特殊的应用程序,可能需要增加应用程序的优先级类别,但通常并不需要。如前所述,本章的应用程序没有改变优先级类别。
当确实需要改变程序的优先级类别时,可以调用SetPriorityClass()。可以调用GetPriorityClass()来获取当前的优先级类别。这两个函数的原型:
DWORD GetPriorityClass(HANDLE hApp);
BOOL SetPriorityClass(HANDLE hApp, DWORD priority);
在此,hApp是进程的句柄。GetPriorityClass()返回应用程序的优先级类别,如果失败的话,返回0。对于SetPriorityClass(),priority指定了进程的新优先级类别。
线程优先级
对于给定的优先级类别,各个线程的优先级确定了它在进程内接收的CPU时间的多少。当线程第一次创建时,它具有普通的优先级,但是您可以改变线程的优先级—— 即使在它执 行时。
可以通过调用GetThreadPriority()来获取线程的优先级设置。可以使用SetThreadPriority()来增加或者减小线程的优先级。这两个函数的原型:
BOOL SetThreadPriority(HANDLE hThread, int priority);
int GetThreadPriority(HANDLE hThread);
对于这两个函数而言,hThread是线程的句柄。对于SetThreadPriority(),priority是新的优先级设置。如果发生错误,则返回值为0;否则,返回非0值。GetThreadPriority()会返回当前的优先级设置。
Windows向应用程序提供了31个不同的优先级设置的支持。
如果有错误发生,则GetThreadPriority()返回THREAD_PRIORITY_ERROR_RETURN。
在大多数情况下,如果线程具有普通的优先级类别,那么可以随意地改变它的优先级设置,而不必担心会给整个系统的性能带来灾难性的影响。您将会看到,在下面部分开发的线程控制面板中,可以改变进程内线程的优先级设置(但是不能改变优先级类别)。