线程优先级

MFC线程优先级程序图示 线程优先级等级描述如下; idle (最低) THREAD_PRIORITY_IDLE LOWEST 低 THREAD_PRIORITY_LOWEST BELOW 低于标准 THREAD_PRIORITY_BELOW_NORMAL NORMAL(标准) THREAD_PRIORITY_NORMAL ABOVE 高于标准 THREAD_PRIORITY_ABOVE_NORMAL HIGHEST (高) THREAD_PRIORITY_HIGHEST C... 阅读详情

出处:http://hi.baidu.com/ronnie_xu/blog/item/280211dc309af6a6cd116686.html

每 个线程都有一个“优先级”,范围是0~31,0为最低优先级,31为最高优先级。当系统决定哪个线程需要调度的时候,首先查看是否存在优先级为31的可调 度线程,如果存在,就从中选择一个进行调度。当该线程的时间片到达之后,系统查看是否存在另一个优先级为31的可调度线程,如果存在,就调度它。

  只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0~30的线程,这样会导致其他线程“饥饿”。

  高优先级线程往往“打断”低优先级线程的执行。比如,当一个优先级为15的线程正在运行,如果此时系统发现一个优先级比15高的线程可以调度,那么该高优先级线程会“打断”那个低优先级线程的执行,哪怕低优先级的时间片才过了一半。

  另外,当系统引导的时候,系统创建一个特殊的线程,称为“zero page”(0页)线程,该线程是整个系统中唯一一个优先级为0(最低)的线程。当系统没有任何线程需要执行的时候,该线程负责将系统中所有RAM页面清零(也就是资源回收)。

  线程优先级有一个抽象层的概念。

  由于一些历史的原因,微软并没有将线程调度程序的行为完全固定下来。微软没有让应用程序充分利用调度程序的特性。微软宣称这个调度程序的行为是变化,在编程的时候需要注意。

  由这几点可见,你的应用程序可以有自己的调度特性。

  Windows API充分反映了系统调度的一个抽象层。如此,就不会直接与系统的调度程序通信,相反,可以调用API函数,根据系统的版本的不同转换这些参数。这一层,就是线程优先级的抽象层。

  下面详细叙述这个抽象层究竟有哪些内容。

  对于进程而言,Windows有一个“优先级类”的概念。这些优先级类作用与进程中的所有线程。Windows 2000/XP/2003/Vista支持6个“优先级类”:

1、Real-time:实时

2、High:高

3、Above normal:高于标准

4、Normal:标准

5、Below normal:低于标准

6、Idle:空闲。

  一个进程应该避免使用“实时”优先级类,因为使用该优先级类会导致其他进程中的线程很难被调度,甚至会打断或者抢占系统线程的执行。“高”优先级类也应该尽量避免,除非有特殊的工作需要使用这个优先级。

  当一个进程的“优先级类”被确定以后,就只需要考虑该进程内部各个线程之间的优先级关系。

  对于进程中的线程而言,有一个“相对线程优先级”的概念,这可以决定一个进程中多个线程之间的优先级关系。

  Windows支持7种“相对线程优先级”:

1、Time-critical:关键时间(最高的相对线程优先级)

2、Heightest:最高(翻译是这么翻译,但是并不是最高的相对线程优先级)

3、Above normal:高于标准

4、Normal:标准

5、Below normal:低于标准

6、Lowest:最低(翻译是这么翻译,但是并不是最低的相对线程优先级)

7、Idle:空闲

   这里并没有提到有关0~31的优先级的任何内容。开发者从来不用具体设置一个线程的优先级,也就是不需要将一个线程优先级设置为0~31中的一个。操作 系统负责将“优先级类”和“相对线程优先级”映射到一个具体的优先级上。这种映射方式,是随Windows版本的不同而不同的。

  以下是Windows 2000/XP/2003/Vista的线程优先级映射方式(书上只说是Vista,但是对比本书第四版,可知2000和Vista是一样的):

 

线程相对

优先级

进程优先级类

Idle

Below Normal

Normal

Above Normal

High

Real-Time

Time-critical

15

15

15

15

15

31

Highest

6

8

10

12

15

26

Above normal

5

7

9

11

14

25

Normal

4

6

8

10

13

24

Below normal

3

5

7

9

12

23

Lowest

2

4

6

8

11

22

Idle

1

1

1

1

1

16

   仔细查看该表,现在知道为什么最好不要将“进程优先级类”设置为“实时”了吧,因为一个进程如果具有“实时”的优先级类,那么该进程中的所有线程的优先 级(最低也有16)比任何具有其他优先级类的进程中的线程的优先级(最高只有15)都要高。这样会导致其他优先级类低于“实时”的进程中的线程无法得到调 度。

  要注意的是,“优先级类”是一个抽象的概念,是对于一个进程而言的,但是不是说进程是可以调度的,只有线程是可以调度的。微软提出这个概念,仅仅只是为了帮助你将它与调度程序的内部运行的情况区分起来。“优先级类”应该是可以影响一个进程中所有线程的优先级的。

  上面讲了有关线程优先级的内容,包括线程的“具体优先级”,“优先级抽象层”的内容(进程“优先级类”、“线程相对优先级”等)。

  下面主要讲述如何在编程中设置线程的优先级。

 

  一个进程,往往关联一个“优先级类”,你可以在CreateProcess函数的fdwCreate参数中设置这个优先级类的具体内容,可以有6种选择,对于6种优先级类:

1、REALTIME_PRIORITY_CLASS:Real-time,实时优先级类

2、HIGH_PRIORITY_CLASS:High,高优先级类

3、ABOVE_NORMAL_PRIORITY_CLASS:Above normal,高于标准

4、NORMAL_PRIORITY_CLASS:Normal,标准

5、BELOW_NORMAL_PRIORITY_CLASS:Below normal:低于标准

6、IDLE_PRIORITY_CLASS:Idle,空闲

 

  你也可以更改一个特定的进程优先级类,通过呼叫SetPriorityClass函数可以到达这个目的。

BOOL SetPriorityClass(
   HANDLE hProcess,      //指定的进程句柄
   DWORD fdwPriority);      //优先级类(对应上面6种取值)

  例如,下面的代码设置当前进程的优先级类为空闲:

SetPrioriytClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);

 

  当然,可以获得某一个进程的优先级类,通过呼叫GetPriorityClass函数:

DWORD GetPriorityClass(HANDLE hProcess);

  该函数返回的值就是对应6个优先级类的值中的一个。

 

  当一个线程被创建,它的“线程相对优先级”默认为normal(标准)。CreateThread函数没有提供设置线程相对优先级的功能。可以调用SetThreadPriority函数设置一个线程的相对优先级。

 

BOOL SetThreadPriority(
   HANDLE hThread,      //指定的线程句柄
   int nPriority);      //线程相对优先级(取值对应如下)

  该函数接受一个线程句柄和线程相对优先级取值,设置对应的线程的相对优先级。该线程相对优先级取值如下:

1、THREAD_PRIORITY_TIME_CRITICAL:Time-critical,关键时间(最高)

2、THREAD_PRIORITY_HIGHEST:Highest,最高(其实是“次高”)

3、THREAD_PRIORITY_ABOVE_NORMAL:Above normal,高于标准

4、THREAD_PRIORITY_NORMAL:Normal,标准

5、THREAD_PRIORITY_BELOW_NORMAL:Below normal,低于标准

6、THREAD_PRIORITY_LOWEST:Lowest,最低(其实是“次低”)

7、THREAD_PRIORITY_IDLE:Idle,空闲(最低)

 

  你可以呼叫GetTreadPriotiry函数取得一个特定线程的相对优先级。

int GetThreadPriority(HANDLE hThread);      //函数返回上述7个取值

  为了创建一个线程相对优先级不是标准的线程,比如要创建一个高于标准的线程,你可以传递CREATE_SUSPENDED参数给 CreateThread,从而创建一个起始状态为“挂起”的线程,然后调用SetThreadPriority函数设置该线程的相对优先级,然后调用 ResumeThread函数恢复该线程的运行。代码如下:

 

DWORD dwThreadID;
HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL,
   CREATE_SUSPENDED, &dwThreadID);
SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);
ResumeThread(hThread);
CloseHandle(hThread);

 

  操作系统会动态地提高线程的基础优先级等级(0~31),一般是为了响应一些I/O事件。

  有的时候,系统动态地提高线程优先级会带来不便。你可以呼叫SetProcessPriorityBoost和SetThreadPriorityBoost函数来通知系统是否需要动态提高线程优先级。

BOOL SetProcessPriorityBoost(
    HANDLE hProcess,
   BOOL bDisablePriorityBoost);
BOOL SetThreadPriorityBoost(
   HANDLE hThread,
   BOOL bDisablePriorityBoost);

 

  这两个函数的第二个参数用于通知系统是否要动态提高指定进程的优先级类和指定线程的相对优先级。

  也可以使用以下两个函数得到这些信息:

BOOL GetProcessPriorityBoost(
   HANDLE hProcess,
   PBOOL pbDisablePriorityBoost);
BOOL GetThreadPriorityBoost(
   HANDLE hThread,
   PBOOL pbDisablePriorityBoost);

windows线程优先级 需要注意的是,线程优先级只是影响线程调度的因素之一,其他因素如线程的状态、资源争用情况等也会对线程的运行顺序产生影响。如果优先级为31的线程的时间片用完,系统会继续查看是否还有其他优先级为31的线程可以调度。只要存在优先级为31的线程,系统就不会调度优先级为0到30的线程,这可能会导致其他线程“饥饿”,即它们无法获得足够的CPU时间。例如,如果一个优先级为15的线程正在运行,而此时系统发现一个优先级更高的线程可以调度,那么高优先级线程会中断低优先级线程的执行,即使低优先级线程的时间片还未用完。 阅读详情

相关推荐

C++线程优先级SetThreadPriority的使用实例

主要介绍了C++线程优先级SetThreadPriority的使用实例,较为详细的讲述了C++线程及其优先级的用法,需要的朋友可以参考下

Windows API 中的SetThreadPriority()

我们都知道线程的执行是没有顺序的,比如下面的例子,有三个线程,分别输出Hello word!   I am sleeping!  Please wait...  I am awake ,如果我们不加控制,那么运行出来的结果可能是 I am sleeping!  Hello word!   Please wait...  I am awake或者其他的情况。那么下面就讲一下怎么让其按照指定的顺序

ICDI的博客 8251

GD32F103程序烧录全攻略:从SWD到串口的实战指南

本文提供了GD32F103微控制器程序烧录的全面实战指南,详细介绍了SWD、JTAG和串口(ISP)三种主流下载方式。文章重点解析了在Keil MDK中使用ST-Link进行SWD下载的完整步骤,包括硬件连接、软件配置和Flash算法设置,并针对烧录过程中的常见问题提供了实用的排坑解决方案,帮助开发者高效完成程序部署。

weixin_29191669的博客 438

线程优先级SetThreadPriority的使用

SetThreadPriority的使用 // ThreadPriority.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include DWORD WINAPI ThreadProcIdle(LPVOID lpParameter) { for (int i=0;i<20;i++) { printf("I'm in thread IDL

小驹的专栏 1万+

【IC】Redhawk-SC输入件配置

Redhawk sc

u011808788的博客 1777

把 MCP Server 直接装进 SAP ABAP:用 Unlimited Display Tools 打通 Agentic SDK 与 SAP ECC / S/4HANA 的最后一公里

摘要:AI与SAP集成的MCP解决方案 企业在AI集成中面临工具链复杂、数据对接繁琐的挑战。Model Context Protocol (MCP)通过标准化工具与数据暴露方式,将集成复杂度从N×M降至N+M。在SAP生态中,MCP Server for SAP直接部署于ABAP层,利用DDIC/CDS视图对接各类Agent SDK,避免中间件风险。 MCP核心包含三类对象: Tools:带元数据的可执行动作 Resources:结构化上下文数据 Prompts:可参数化提示模板 ABAP层实现MCP Se

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 688

Qt线程优先级

Qt 线程优先级 关于线程或许需要了解的基础函数介绍 Qt里 线程分八个等级 Constant Value Description QThread::IdlePriority 0 scheduled only when no other threads are running. QThread::LowestPriority 1 scheduled less often than LowPriority. QThread::LowPriority 2 scheduled less o

weixin_44486830的博客 5670

YOLOv11【第六章:模型压缩与极致优化篇·第15节】YOLOv11 专用剪枝工具库使用指南!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1312

线程的优先级

线程的优先级   每个线程都有一个“优先级”,范围是0~31,0为最低优先级,31为最高优先级。当系统决定哪个线程需要调度的时候,首先查看是否存在优先级为31的可调度线程,如果存在,就从中选择一个进行调度。当该线程的时间片到达之后,系统查看是否存在另一个优先级为31的可调度线程,如果存在,就调度它。    只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0~30的线程,

zjlove1989的专栏 2823

【论文硬核拆解】Ctx2Skill:让大模型自己跟自己玩,从上下文里「进化」出可复用技能

论文选择自然语言技能可解释性:技能是人类可读的 Markdown 文件,可以审查、编辑、调试可迁移性:即插即用,从一个模型到另一个模型无需参数访问:对闭源模型友好这比 SKILL0/SkillRL 等参数内化方法更实用,尤其是在商业 API 场景。

步子哥的博客 155

基于Simulink的占空比调制DTC降低转矩脉动

修改传统SVPWM模块,输入占空比d和有效矢量索引,计算Ton​=d∗Tc​、Toff​=(1−d)∗Tc​,生成对称PWM波形(替代开关表直接输出)。:低速时(n<500rpm)减小dmax​=0.6(避免磁链畸变),高速时(n>2000rpm)增大dmax​=0.8(提升动态响应);kT​/kψ​:转矩/磁链误差增益(需整定,如kT​=0.02/(N⋅m),kψ​=0.1/Wb);(θ为电压矢量与磁链夹角)。② SVM-DTC(占空比计算模块启用,d0​=0.5,kT​=0.02,kψ​=0.1)。

amy_mhd的博客 87

java线程池多线程优先级_Java线程优先级

java线程池多线程优先级 Java线程优先级 (Java Thread Priorities) Priority of a thread describes how early it gets execution and selected by the thread scheduler. In Java, when we create a thread, always a priority i...

cunfen6312的博客 5109

scratch绘制四个三角形 2024年6月中国电子学会 图形化编程 scratch编程等级考试二级真题和答案解析

​ scratch绘制四个三角形 一、题目要求 2024年6月电子学会图形化编程Scratch等级考试二级真题 1、准备工作 1.保留默认角色小猫; 2.添加背景Stars。 2、功能实现 1 .隐藏角色小猫,设置画笔裙始位置为(0,0),画笔颜色为黄色,画笔的粗细为5; 2. 点击绿旗,绘制如下图所示图形,三角形的边长为50。 二、案例分析 1、角色分析 角色:小猫 2、背景分析 背景:Stars背景 3、前期准备 1. 保留默认的小猫不变 ​

青少年编程学习指导 1717

线程优先级详解

线程的优先级是什么 在操作系统中,线程可以划分优先级,线程优先级越高,获得 CPU 时间片的概率就越大,但线程优先级的高低与线程的执行顺序并没有必然联系,优先级低的线程也有可能比优先级高的线程先执行。 如何设置线程的优先级 在 Java 中,可以通过 setPriority(int newPriority) 方法来设置线程的优先级。 线程的优先级分为 1~10 一共 10 个等级,所有线程默认优先级为 5,如果优先级小于 1 或大于 10,则会抛出 java.lang.IllegalArgumentExce

明月燃雨 1万+

高分SCI讨论部分必学AI写作套路!仅需五步结合GPT‑5辅助,让你的SCI论文更有说服力(附实用AI提示词)

对于很多写SCI论文的学术人来说,其实“讨论部分”才是最致命的,网上虽然有大量的写作技巧和模板提供参考,但往往让人眼花缭乱,还是不知道如何下手。即便是下手了,也很难兼顾学术性与可读性,实际上讨论部分的难点并不在于写,而在于你能研究结果说清楚。今天七哥教你借助GPT-5,用五步法结合精心设计的AI提示词,让你能在科学逻辑与语言表达上一次性解决“讨论部分”的结构、内容、润色和翻译问题,轻松写出符合高分SCI期刊要求的讨论段落。

智能AI让学术科研更容易 1331

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java中对线程优先级

线程优先级在Java中提供了一种控制线程调度的机制,但它的实际效果受到多种因素的影响,包括操作系统的调度策略和系统资源的竞争。在Java多线程编程中,虽然可以利用线程优先级来优化程序的性能,但它并不能保证线程调度的确定性。开发者在使用线程优先级时应保持谨慎,不应过度依赖优先级来解决并发问题。更为重要的是,合理设计线程的执行逻辑,选择适当的并发工具和调度策略,以确保程序的正确性和性能。

Flying_Fish_roe的博客 1744

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

mfc 线程的优先级

知识点:  线程优先级  获取当前线程句柄  线程优先级设置  线程优先级变动  线程优先级获取 一、线程优先级(Thread priority ) 简单的说就是(线程)的优先级越高,那么就可以分占相对多的CPU时间片。 每...

chunkezha7046的博客 1138

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java改变线程优先级

一点睛 每个线程在执行时都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会。 每个线程默认的优先级都与创建它的父线程的优先级相同,在默认情况下,main线程具有普通优先级,由main线程创建的子线程也具有普通优先级。 二 代码 public class PriorityTest extends Thread { // 定义一个有参数的...

实践求真知 3317

多线程——线程优先级

目录 1、线程优先级具有继承性 2、线程优先级的作用 Thread类源码中定义: 最低优先级为1 public final static int MIN_PRIORITY = 1; 一般没有继承,没有显示指定优先级时,默认优先级为5 public final static int NORM_PRIORITY = 5; 最高优先级为10 public final static int ...

dgh112233的博客 1507
下一篇: 理解互斥量和信号量
hrfcap
博客等级 码龄20年 2粉丝 1原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值