MFC | 线程的优先级

265 阅读2分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

如何启动一个线程,在之前的文章中已经有过介绍了,可以去翻看之前的文章。这里介绍的启动线程的函数使用CreateThread();

一个程序中是可以启动多个线程的,线程的调度是有优先级的,优先级高的线程,先获得CPU的调度。操作系统也会视情况调整各个线程的优先级。例如前台线程的优先级应该调高一些,后台线程的优先级应该调低一些。

线程的优先级范围从0(最低)到31(最高)。

产生一个线程时,指定这个线程的优先级需要两个步骤,第一步是指定“优先级等级”给进程,第二步是指定“相对优先级”给该进程所拥有的线程。

指定“优先级等级”给进程,是在调用CreateProcess()创建进程函数的dwCreationFlags参数中指定的。如果不指定,系统默认给的是NORMAL_CLASS。除非父进程是IDLE_PRIORITY_CLASS,那么子进程也会是IDLE_PRIORITY_CLASS。

优先级的划分:

等级       代码                     优先级值
idle      IDLE_PRIORITY_CLASS      4
normal    NORMAL_PRIORITY_CLASS    9(前台)或7(后台)
high      HIGH_PRIORITY_CLASS      13
realtime  REALTIME_PRIORITY_CLASS  24
  • "idle"等级的线程只有在CPU的空闲时间才执行,这个等级最适合用于系统监视软件,或屏幕保护软件。
  • "normal"是默认等级。系统可以动态改变这个等级的线程的优先级,但只限于"normal"等级。当进程变成前台时,线程优先级提升为9;当进程变成后台是,优先级降低为7。
  • "high"等级是为了满足立即反应的需要,例如使用者按下Ctrl+Esc时,立刻把工作管理器打开。
  • "realtime"等级几乎不会被一般的应用程序使用。就连系统中控制鼠标、键盘、驱动器状态重新扫描、Ctrl+Alt+Del等的线程都比"realtime"的优先级还低。这种等级使用在“如果不在某个时间范围内被执行的话,数据就要遗失”的情况。这个等级一定得在正确评估之下使用,如果把这样的等级指定给一般的线程,可能会造成卡死,因为这个线程优先级很高,一直执行的话,其它线程就没有机会被执行了。

在以上四个等级中,可以调用SetThreadPriority()设定精确的优先级,对以上四个等级进行微调。

参数为: THREAD_PRIORITY_LOWEST(-2);THREAD_PRIORITY_BELOW_NORMAL(-1);THREAD_PRIORITY_NORMAL(不变);THREAD_PRIORITY_ABOVE_NORMAL(+1);THREAD_PRIORITY_HIGHEST(+2);