线程优先权Thread Priority概念总结

2023-05-16

全文参考《WIN32多线程设计》一书。
为什么会有线程优先权:
为什么CPU处理线程时会按优先级执行?想象在忙碌的一天中,有很多事情待做但时间又不够,其中有很多紧急的事情。比如当晚的英语在线测试,明天的正式作业,下午重要的考试等等,你将如何安排一天的活动?如果这期间时想上厕所,或突然来电话了,你将如何选择?…是不是最重要的事最先做?这时候当然就要有个做事的主次顺序,这种处理事情的主次顺序反映在WIN32多线程中,则以0-31数值大小表示线程的重要程度,CPU以等待中的线程优先值最大的为目标决定下一个该执行哪条线程。对此,Windows实现了一个基于优先级的抢先式多处理及调度系统。

线程优先权概念:
Win32 有所谓的优先权( priority)观念,用以决定下一个获得 CPU 时间的线程是谁。较高优先权的线程必然获得较多的 CPU 时间

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

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

HIGH_PRIORITY_CLASS13
IDLE_PRIORITY_CLASS4
NORMAL_PRIORITY_CLASS7 or 8
REALTIME_PRIORITY_CLASS24

优先权层级:
线程的优先权层级( Priority Level )是对进程的优先权类别的一个修改,
使你能够调整同一个进程内的各线程的相对重要性。一共有七种优先权层级,

THREAD_PRIORITY_HIGHEST+2
THREAD_PRIORITY_ABOVE_NORMAL+1
THREAD_PRIORITY_NORMAL0
THREAD_PRIORITY_BELOW_NORMAL–1
THREAD_PRIORITY_LOWEST-2
THREAD_PRIORITY_IDLESet to 1
THREAD_PRIORITY_TIME_CRITICALSet to 15

动态提升:
优先级应用注意操作系统采用的“动态提升”会影响线程的优先级,所以常常导致真真实执行的线程 顺序并非按照你设定的优先级顺序执行-------------------详情友情访问: Windows线程优先级提升策略

设置线程优先级函数:
BOOL SetThreadPriority(
HANDLE hThread,
int nPriority
);

获取线程优先级函数:
int GetThreadPriority(
HANDLE hThread
);

线程创建时挂起:
将第四个参数设置为 CREATE_SUSPENDED。
CreateThread(NULL,0,FUN,NULL,CREATE_SUSPENDED,NULL);

线程执行中挂起:
SuspendThread(hThread);
单个线程可以暂停若干次。如果一个线程暂停了3次,它必须恢复3次,然后它才可以被分配给一个CPU。

线程恢复:
挂起的线程需要用相应函数恢复。
DWORD ResumeThread(HANDLEhThread);

实例
写一段代码将以上提到的函数都用一下。
代码解释:创建7个线程,创建时挂起线程,设置7个不同的优先级,按下回车,依次打印线程自己的优先级,查看执行情况。

#include<windows.h>
#include<stdio.h>

HANDLE H[5],HE,H1,H16;

DWORD WINAPI FUN(LPVOID P)
{
	int *l=(int *)P;
	WaitForSingleObject(HE,INFINITE);
	//获取线程优先级
	switch (GetThreadPriority(H[*l+2]))
	{
		case THREAD_PRIORITY_TIME_CRITICAL:
			{
				printf("THREAD_PRIORITY_TIME_CRITICAL  \t %d\n",*l);
			}
			break;
		case THREAD_PRIORITY_HIGHEST:
			{
				printf("THREAD_PRIORITY_HIGHEST\t %d\n",*l);
			}
			break;
		case THREAD_PRIORITY_ABOVE_NORMAL:
			{
				printf("THREAD_PRIORITY_ABOVE_NORMAL\t %d\n",*l);
			}
			break;
		case THREAD_PRIORITY_NORMAL:
			{
				printf("THREAD_PRIORITY_NORMAL\t %d\n",*l);
			}
			break;
		case THREAD_PRIORITY_BELOW_NORMAL:
			{
				printf("THREAD_PRIORITY_BELOW_NORMAL\t %d\n",*l);
			}
			break;
		case THREAD_PRIORITY_LOWEST:
			{
				printf("THREAD_PRIORITY_LOWEST\t %d\n",*l);
			}
			break;
		case THREAD_PRIORITY_IDLE:
			{
				printf("THREAD_PRIORITY_IDLE\t %d\n",*l);
			}
			break;
		default:
			printf("false\t%d\n",*l);
	}
	SetEvent(HE);
	return 0;
}

int main()
{
	int i,j[7];
	j[5]=THREAD_PRIORITY_IDLE;
	j[6]=THREAD_PRIORITY_TIME_CRITICAL; //数组初值初始化对应线程优先级
	
	HE=CreateEvent(NULL,false, false ,NULL);
	
	H1=CreateThread(NULL,0,FUN,&j[5],CREATE_SUSPENDED,NULL);//将优先级设定好存在数组中并传给对应线程
	H16=CreateThread(NULL,0,FUN,&j[6],CREATE_SUSPENDED,NULL);
	for(i=4;i>=0;i--)
	{
		j[i]=i-2;
		H[i]=CreateThread(NULL,0,FUN,&j[i],CREATE_SUSPENDED,NULL);
	}
	
	for(i=0;i<5;i++)//关闭动态调整优先级
	{
		SetThreadPriorityBoost(H[i],false);
	}

    for(i=-2;i<3;i++)       //正式调整优先级
    {
    	SetThreadPriority(H[i+2],i);
	}
	SetThreadPriority(H1,THREAD_PRIORITY_IDLE);
	SetThreadPriority(H16,THREAD_PRIORITY_TIME_CRITICAL);
	
	ResumeThread(H1);
	for(i=0;i<5;i++)//将挂起的线程恢复
	{
		ResumeThread(H[i]);
	}
	ResumeThread(H16);
	
	
	getchar();
	SetEvent(HE);
	Sleep(INFINITE);
	return 0;
}

执行结果:
在这里插入图片描述
实际执行顺序并不理想,这可能和很多因素有关,待深入理解学习后再尝试找出原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程优先权Thread Priority概念总结 的相关文章

  • 双系统安装Ubuntu(16.04)(含重装教程)

    双系统安装Ubuntu xff08 16 04 xff09 正文制作启动盘给Ubuntu分硬盘空间安装Ubuntu系统 笔者之前装过Ubuntu的双系统 xff0c 现在是重装 xff0c 但本教程同时适用初次安装和二次安装的 xff0c
  • (五)通俗易懂理解——双向LSTM

    中文翻译作者博客 xff1a https www cnblogs com wangduo p 6773601 html utm source 61 itdadao amp utm medium 61 referral 英文原文作者网址 xf
  • linux服务器升级node版本

    最近部署前端代码时 xff0c 发现服务器node版本太低 xff0c 导致前端工程编译不成功 于是升级了一下 下载node安装包 这里我们在node官网下载LTS xff08 即当前稳定版本 xff09 xff0c 找到对应当前服务器环境
  • 【坐标转换】lla转换成enu坐标(无损版)

    import numpy as np import smpy utils as smpy utils import ditu topbind as tb from scipy spatial transform import Rotatio
  • C++ : 力扣_Top(62-84)

    C 43 43 力扣 Top 62 84 文章目录 C 43 43 力扣 Top 62 84 62 不同路径 xff08 中等 xff09 66 加一 xff08 简单 xff09 69 x的平方根 xff08 中等 xff09 70 爬楼
  • PID参数整定具体方法-圆周倒立摆

    0 前言 关于PID参数的整定 xff0c 网上调节的口诀 原则 方法满天飞 xff0c 但是并没有具体的到步的教程 xff0c 作为初学者且非自动化相关专业学生有点看不懂 一脸懵逼 xff0c 走了不少弯路 xff0c 呕心沥血才调节好
  • 将字符串逐一入队,再出队列输出。

    C语言 创建一个简单链式队列代码 xff1a 将字符串逐一入队 xff0c 再出队列输出 队列是一种特殊的线性表 xff0c 特殊之处在于它只允许在表的前端 xff08 front xff09 进行删除操作 xff0c 而在表的后端 xff
  • cmake find_package找不到opencv

    当然找不到opencv可能是你安装的时候修改了安装位置 而按逻辑讲 xff0c 我们想让程序找到我的文件位置 xff0c 我们可以事先给程序位置信息 在CMakeLists txt写上我们地opencv的build的位置 set OpenC
  • 【精华】ROS学习(二):Realsense ROS驱动安装

    文章目录 Realsense ROS驱动安装1 系统环境及安装准备2 安装Realsense SDK3 安装Realsense ROS4 异常问题 1 异常问题1 2 异常问题2 Realsense ROS驱动安装 1 系统环境及安装准备
  • 20210202 电脑端开移动热点(无需任何软件,WIN10自带)

    卸载掉第三方软件 刚刚试了下 xff0c 如果连不上 xff0c 有可能是因为有梯子的原因 xff0c 关掉就能上网 或者先连上 xff0c 再开梯子
  • ROS Message 类型总结

    文章目录 ROS Message 类型总结内置类型 1 常见类型 2 自定义msg消息1 添加 msg 文件2 package xml3 CMakeLists txt ROS Message 类型总结 ROS使用简化的消息描述语言来描述RO
  • PHP的TZ环境变量是干什么的?底层原理是什么?

    PHP的TZ环境变量用于指定系统时区 底层原理是 xff0c PHP运行时可以读取环境变量 xff0c 以便确定系统时区并在日期和时间函数中使用 具体地说 xff0c 当PHP运行时 xff0c 它会检查系统的TZ环境变量 如果该环境变量存
  • HTTP响应是干什么的?为什么需要HTTP响应?底层原理是什么?

    HTTP响应是指服务器对客户端的HTTP请求所作出的回应 xff0c 它包含了HTTP协议规定的响应状态码 响应头部以及响应内容三个部分 HTTP响应的作用是将服务器端处理后的数据或结果返回给客户端 客户端发送HTTP请求后 xff0c 服
  • PHP对变量进行赋值的过程底层经历了什么?底层原理是什么?

    在PHP中 xff0c 对变量进行赋值的过程包括以下步骤 xff1a 解析器检查语法 xff1a PHP代码在执行之前 xff0c 首先需要进行语法解析 解析器会检查代码是否符合语法规范 xff0c 如果出现语法错误 xff0c 解析器会发
  • PHP为什么需要字符串处理函数?底层原理是什么?

    PHP作为一种脚本语言 xff0c 经常需要处理字符串数据 字符串处理函数是用于对字符串进行操作和处理的一组函数 xff0c 包括字符串的截取 查找 替换 转换等等操作 底层原理是PHP内核通过字符指针和字符数组来存储和处理字符串 xff0
  • PHP为什么需要抛出异常?底层原理是什么?

    在编程过程中 xff0c 可能会出现一些意外情况或者错误 xff0c 这些错误需要被捕获并处理 异常是一种错误处理机制 xff0c 它可以在程序出现异常情况时中断程序的正常执行流程 xff0c 跳转到异常处理代码块 xff0c 避免程序因错
  • PHP的代码注入是什么意思?底层原理是什么?

    PHP的代码注入 xff08 Code Injection xff09 指的是攻击者通过构造恶意的输入 xff0c 在应用程序中注入一些非法的代码 xff0c 从而在应用程序中执行攻击者的指令或代码 这种攻击方式通常会利用应用程序的漏洞 x
  • 信号量 Semaphore 用法及注意事项总结

    信号量 信号量在WIN32系统中是核心对象 xff0c 故其用法同其他同步机制类似 xff0c 但可应用于多个线程同步运行 xff0c 即同时有至多有限个线程同时工作 xff0c 而线程上线数量取决于初始化时指定的最大值 1 创建一个信号量
  • PHP的大数组是什么意思?有什么作用?底层原理是什么?

    在 PHP 中 xff0c 大数组指的是包含大量元素的数组 xff0c 其元素数量可以达到数百万或数千万甚至更多 这种数组在处理大规模数据时非常有用 xff0c 例如在数据分析 机器学习和科学计算等领域中 PHP 的大数组的实现方式可以采用
  • PHP的全局变量是是干什么的?有什么作用?底层原理是什么?

    PHP的全局变量是指在整个PHP脚本中都可以被访问到的变量 这些变量存储在PHP进程的内存中 xff0c 并在整个脚本执行期间保持不变 全局变量的作用是在不同的函数和代码块中共享数据 xff0c 从而使代码更加简洁和易于维护 全局变量的底层

随机推荐

  • PHP的日志是干什么的?有什么用?底层原理是什么?

    在软件开发中 xff0c 日志是记录系统活动的重要方式之一 xff0c 也是排查问题和故障排除的主要工具之一 PHP提供了多种日志记录方式 xff0c 如文件日志 数据库日志和Syslog等 它们的共同目的是在代码执行时收集和记录信息 xf
  • PHP的开发环境和部署环境是什么意思?底层原理是什么?

    PHP的开发环境和部署环境是指在开发和部署PHP应用程序时所使用的不同环境 开发环境通常是指程序员在本地开发PHP应用程序的环境 xff0c 其目的是为了让程序员能够快速开发和测试应用程序 xff0c 同时方便调试和排除问题 在开发环境中
  • PHP为什么需要错误报告级别?底层原理是什么?

    PHP提供了多种错误报告级别 xff0c 包括错误信息 警告信息 提示信息和严格模式等 xff0c 用于在开发过程中捕获和处理错误 底层原理是通过PHP的内部错误处理机制来实现的 当PHP执行脚本时 xff0c 如果出现了错误 xff0c
  • PHP的代码调试技巧是什么意思?底层原理是什么?

    PHP的代码调试技巧是指在开发过程中 xff0c 通过调试技术来解决代码中的问题 xff0c 提高代码的可靠性和稳定性 这些技巧可以帮助开发人员快速定位代码中的错误 xff0c 提高代码的质量和效率 PHP提供了多种调试技术 xff0c 包
  • PHP的mysqli扩展和mysql扩展的区别是什么?底层原理是什么?

    mysqli和mysql扩展都是PHP提供的操作MySQL数据库的扩展 它们的区别在于mysqli扩展是MySQL Improved Extension的简写 xff0c 是mysql扩展的改进版 xff0c 提供了更好的性能和更多的功能
  • PHP的依赖关系是什么意思?底层原理是什么?

    PHP的依赖关系指的是PHP应用程序或库与其他软件包或库之间的关系 这些软件包或库可能包括操作系统提供的库 xff0c 例如文件I O和网络功能 xff0c 也可能包括第三方库 xff0c 例如数据库客户端库和图像处理库 底层原理是 xff
  • 什么是Composer?底层原理是什么?

    Composer是PHP的一个依赖管理工具 xff0c 它可以帮助开发者在项目中自动管理依赖关系 xff0c 例如第三方库 框架 组件等 通过Composer xff0c 可以在项目中添加 更新 卸载依赖项 xff0c 并自动解析它们的依赖
  • 为什么composer可以自动管理依赖关系?底层原理是什么?

    Composer能够自动管理依赖关系的原理是基于包管理和自动加载的机制 首先 xff0c Composer通过一个名为Packagist的在线包存储库来管理各种PHP包 xff0c 这个仓库中包含了大量的PHP库和框架 xff0c 开发者可
  • windows线程同步-事件Event用法总结

    事件对象 Win32 中最具弹性的同步机制就属 events 对象了 Event 对象是一种核 心对象 xff0c 它的唯一目的就是成为激发状态或未激发状态 这两种状态全由程序 来控制 xff0c 不会成为 Wait 函数的副作用 Even
  • composer.lock是干什么的?底层原理是什么?

    composer lock文件是Composer工具在安装依赖包时生成的一个锁文件 它记录了当前应用程序所依赖的所有PHP库及其版本号 xff0c 以及所有依赖库所依赖的其他库及其版本号等信息 在运行composer install命令时
  • PHP的Zend引擎是干什么的?底层原理是什么?

    PHP的Zend引擎是PHP解释器的核心组件 xff0c 负责将PHP代码转换为可执行的指令集 xff0c 并执行这些指令 Zend引擎是PHP的默认执行引擎 xff0c 被广泛使用 Zend引擎的底层原理可以分为以下几个关键步骤 xff1
  • PHP解释器是干什么的?底层原理是什么?

    PHP解释器是用于解释执行PHP代码的软件程序 它负责将编写的PHP代码转换为可执行的机器指令 xff0c 并执行这些指令以实现代码的功能 PHP解释器的底层原理可以分为以下几个步骤 xff1a 词法分析 xff08 Lexical Ana
  • PHP代码的底层是什么?底层原理是什么?

    PHP代码的底层是由计算机可执行的机器码 xff08 二进制指令 xff09 组成 底层原理是将PHP代码经过编译和解释执行的过程转化为机器码 底层原理可以分为以下几个步骤 xff1a 词法分析 xff08 Lexical Analysis
  • Jetson Xavier NX 的SD卡系统镜像制作

    Jetson Xavier NX 的SD卡系统镜像制作 一 SD卡系统查看二 系统镜像制作三 系统镜像烧录 一 SD卡系统查看 现有的SD卡的内存为128G xff0c 其中64G内存并未分配 span class token commen
  • 嵌入式Linux下使用crond服务

    参考 xff1a https www linuxidc com Linux 2014 02 97369 htm http www linuxidc com Linux 2014 02 97360 htm https blog csdn ne
  • 关于Flexsns Sky 卡80%,以及乱码的解决问题

    一直被 flexsns sky 这个应用折磨好久了 xff0c 刚开始的时候安装成功 但是打开界面一直卡在80 那里 xff0c ucenter 里面的设置也是对的 官网也是挂的 xff01 于是百思不得解 接下来 我来说说我的解决办法把
  • Ubuntu18.04运行ORB-SLAM3(Demo+本地Realsense D415运行)

    ORB SLAM3论文地址 xff1a https arxiv org abs 2007 11898 代码地址 xff1a https github com UZ SLAMLab ORB SLAM3 一 安装库 根据ORB SLAM3源代码
  • ROS中的坐标与坐标系转换

    ROS中的TF 官网建议新工作直接使用tf2 xff0c 因为它有一个更清洁的界面 xff0c 和更好的使用体验 xff08 自ROS Hydro以来 xff0c tf第一代已被 弃用 xff0c 转而支持tf2 xff09 TF介绍 TF
  • 激光雷达与相机融合(二)-----基于openCV的YOLO目标检测

    代码解析 1 加载模型 span class token comment load image from file span cv span class token operator span Mat img span class toke
  • 线程优先权Thread Priority概念总结

    全文参考 WIN32多线程设计 一书 为什么会有线程优先权 xff1a 为什么CPU处理线程时会按优先级执行 xff1f 想象在忙碌的一天中 xff0c 有很多事情待做但时间又不够 xff0c 其中有很多紧急的事情 比如当晚的英语在线测试