《Win32多线程程序设计》之线程优先级

来源:互联网 发布:通讯录恢复软件 编辑:程序博客网 时间:2024/06/01 22:04

线程优先权(Thread Priority)

Win32 优先权是以数值表现的,并以进程的“优先权类别(priorityclass)”、线程的“优先权层级 (priority level)”和操作系统当时采用的“动态提升(Dynamic Boost )”作为计算基准。 所有因素放在一起,最后获得一个 0~31 的数值。拥有最高优先权之线程,即为下一个将执行起来的线程。

1. 优先权类别(Priority Class)
进程属性,Win32 提供四种优先权类别,每一个类别对应一个基本的优先权层级。
优先权类别(Priority Classes) 基础优先权值(base priority)
HIGH_PRIORITY_CLASS 13
IDLE_PRIORITY_CLASS 4
NORMAL_PRIORITY_CLASS 7 or 8(译注:有些资料上写 7 or 9)
REALTIME_PRIORITY_CLASS 24

大部分程序使用 NORMAL_PRIORITY_CLASS 。少数情况下才会考虑使用其他类别。例如, Task Manager就是使用 HIGH_ PRIORITY_CLASS,所以即使其他程序处于非常忙碌的状态下,它也总是能够有所反应。

屏 幕 保 护 程 序 使 用IDLE_PRIORITY_CLASS,它就只会在 CPU 绝对空闲的时候才执行。

最后一个类别是 REALTIME_ PRIORITY_CLASS。这个类别用以协助解决一些和时间有密切关系的工作。

优先权类别适用于进程而非线程。你可以利用 SetPriority Class() 和GetPriorityClass() 来调整和验证其值。

2. 优先权层级(Priority Level)
七种优先权层级
优先权层级(Priority Levels) 调整值
THREAD_PRIORITY_HIGHEST +2
THREAD_PRIORITY_ABOVE_NORMAL +1
THREAD_PRIORITY_NORMAL 0
THREAD_PRIORITY_BELOW_NORMAL –1
THREAD_PRIORITY_LOWEST –2
THREAD_PRIORITY_IDLE Set to 1
THREAD_PRIORITY_TIME_CRITICAL Set to 15
注意: 对于 REALTIME_PRIORITY_CLASS 的调整值,有点不同于上表所列。

优先权层级可以用 SetThreadPriority () 改变 和用 GetThreadPriority () 获知。

3. KERNEL32.DLL 中的优先权

这里写图片描述

4. 动态提升(Dynamic Boost)
决定线程真正优先权的最后一个因素是其目前的动态提升值(Dynamic Boost)。所谓动态提升是对优先权的一种调整,使系统能够机动对待线程,以强化程序的可用性。

Window s N T 施行于所有前台程序的“线程动态提升”。
【这部分???】

最后,慎用线程优先级,一旦设置不当,可能造成死锁等问题。

其实,实际应用中也几乎没用到过线程优先级~不知道将来会不会碰到~

具体修改优先级方法:

需在线程创建后修改,此时需在CreateThread函数的第5个属性设置CREATE_SUSPENDED,即创建后只返回句柄,线程不马上执行。即可对线程做初始化工作。

HANDLE hThread;DWORD threadId;hThread = CreateThread(NULL,0,ThreadFunc,0,CREATE_SUSPENDED,&threadId);SetThreadPriority(hThread, THREAD_PRIORITY_IDLE);

设置好后,用ResumeThread()函数启动线程。同样,对应有SuspendThread()函数挂起线程。
但是需小心使用SuspendThread(),SuspendThread() 是另一个可能会潜在引发问题的函数。考虑一下这种情况:一个进程拥有三个线程A,B,C。线程C正在某个 critical section 内,而线程B正在等它出来。然后,线程A挂起了线程C。在这种情况下,线程C将永远不会离开 critical section,而线程B也就相当于进入了死锁状态。

SuspendThread() 的最大用途就是用来协助撰写调试器。调试器允许在程序员的控制之下,启动或停止任何一个线程。