Win32多线程 -- 进程优先权与线程优先级

1. 优先权类别(Priority Class)

"优先权类别"是进程的属性之一。这个属性可以表现出这一进程和其他进程比较之下的重要性。 Win32 提供四种优先权类别,每一个类别对应一个基本的优先权层级。下表展示了四个优先权类别。

优先权类别(Priority Classes)基础优先权值(base priority)
HIGH_PRIORITY_CLASS13
IDLE_PRIORITY_CLASS4
NORMAL_PRIORITY_CLASS7 or 8(有些资料上写 7 or 9)
REALTIME_PRIORITY_CLASS24

 

大部分程序使用 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_IDLESet to 1
THREAD_PRIORITY_TIME_CRITICALSet 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). 所谓动态提升是对优先权的一种调整, 使系统能够机动对待线程,以强化程序的可用性。由操作系统决策。
小心翼翼地设定线程优先权是件多么重要的事情。改变线程优先权可能会打开潘朵拉的盒子,一些新的问题跑出来,死锁的阴影也潜在性地酝酿着。虽然优先权的基础知识很简单,但其实用面却可能很复杂。如果你的目标是保持简单,那就还是避免处理"优先权"这个烫手山芋吧。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值