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。最后一个类别是 REALTIME_PRIORITY_CLASS。这个类别用以协助解决一些和时间有密切关系的工作。优先权类别适用于进程而非线程,可以利用 SetPriorityClass() 和GetPriorityClass()来调整和验证其值。
2. 优先权层级(Priority Level)
线程的优先权层级(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 的调整值,有点不同于上表所列
2.1 优先权层级设置
BOOL SetThreadPriority(
HANDLE hThread,
int nPriority
);
如果成功, 传回上表所列的其中一个值; 如果失败, 传回FALSE, GetLastError()可以获得更详细的信息.
2.2 优先权层级获取
int GetThreadPriority(
HANDLE hThread
);
如果函数成功, 传回线程的优先级. 如果失败, 就传回THREAD_PRIORITY_ERROR_RETURN. GetLastError()可以获得更详细的信息.
2.3 动态提升(Dynamic Boost)
决定线程真正优先权的最后一个因素是其目前的动态提升值(Dynamic Boost). 所谓动态提升是对优先权的一种调整, 使系统能够机动对待线程,以强化程序的可用性。由操作系统决策。
小心翼翼地设定线程优先权是件多么重要的事情。改变线程优先权可能会打开潘朵拉的盒子,一些新的问题跑出来,死锁的阴影也潜在性地酝酿着。虽然优先权的基础知识很简单,但其实用面却可能很复杂。如果你的目标是保持简单,那就还是避免处理"优先权"这个烫手山芋吧。