当前位置: 首页 > news >正文

加锁造成的线程优先级反转

优先级反转(Priority Inversion),也称优先级翻转,一般是在优先级不同的多线程环境中发生。在桌面操作系统中,线程的优先级不是太重要,因此较少见优先级反转的现象。但是,优先级反转是实时操作系统(RTOS)中一个常见的问题,特别是在采用优先级调度算法的系统中。这个问题通常发生在多个线程共享一个资源(如一个互斥锁或信号量)时,低优先级的任务意外地阻塞了高优先级的任务。

假设有3个线程,thread1、thread2 和 thread3,它们的优先级依次为thread1 < thread2 < thread3。同时运行这3个线程,且只有 thread1 和 thread3 需要占用资源A。当 thread1 执行时,占用了资源A,并且未释放资源A,这种情况下,发生线程切换时,优先执行thread3,但是,由于 thread3 需要占用资源A,而资源A被 thread1 占用并未被释放,因此,thread3 需要等待 thread1 执行释放资源A。但是,由于 thread2 的优先级比 thread1 要高,导致线程切换时,优先执行 thread2,导致 thread1 无法执行,这样看起来就像 thread3 需要等待 thread2 执行完毕,才能执行 threa3,看起来就像thread2 的优先级 > thread3的优先级。这种现象就被称为优先级反转。

以下代码演示了优先级不同的3个线程,执行相同的任务,优先级最高的线程获得的CPU时间最多,最先执行完毕,优先级最低的线程获得的CPU时间最少,最后执行完毕:


#include <chrono>
#include <iostream>
#include <mutex>
#include <pthread.h>
#include <unistd.h>void consumeTime()
{int iMax = 2000000;int jMax = 10000;for(int i = 0; i < iMax; i++)for(int j = 0; j < jMax; j++);
}
std::int64_t getCurTs()
{return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock().now().time_since_epoch()).count();
}
static void* thread1(void * par)
{std::cout << "thread1 begin" << std::endl;std::int64_t tms = getCurTs();consumeTime();std::int64_t tme = getCurTs();int span = (int)(tme - tms);std::cout << "thread1 end , duration : " << span <&l

相关文章:

加锁造成的线程优先级反转

优先级反转(Priority Inversion),也称优先级翻转,一般是在优先级不同的多线程环境中发生。在桌面操作系统中,线程的优先级不是太重要,因此较少见优先级反转的现象。但是,优先级反转是实时操作系统(RTOS)中一个常见的问题,特别是在采用优先级调度算法的系统中。这个问…...

【日常记录-Java】SpringBoot中使用无返回值的异步方法

Author&#xff1a;赵志乾 Date&#xff1a;2024-09-05 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 在SpringBoot中&#xff0c;使用Async注解可以很方便地标记一个方法为异步执行。好处是调用者无需等待这些方法完成便可继续执…...

【深度学习】多层感知机的从零开始实现与简洁实现

可以说&#xff0c;到现在我们才真正接触到深度网络。最简单的深度网络称为多层感知机。 多层感知机由多层神经元组成&#xff0c;每一层与它的上一层相连&#xff0c;从中接收输入&#xff1b;同时每一层也与它的下一层相连&#xff0c;影响当前层的神经元。 和以前相同&…...

4、Django Admin对自定义的计算字段进行排序

通常&#xff0c;Django会为模型属性字段&#xff0c;自动添加排序功能。当你添加计算字段时&#xff0c;Django不知道如何执行order_by&#xff0c;因此它不会在该字段上添加排序功能。 如果要在计算字段上添加排序&#xff0c;则必须告诉Django需要排序的内容。你可以通过在…...

rsync搭建全网备份

rsync搭建全网备份 1. 总体概述1.1 目标1.2 简易指导图1.3 涉及工具或命令1.4 环境 2. 实施2.1 配置备份服务器2.2 备份文件准备2.3 整合命令2.4 扩展功能 1. 总体概述 1.1 目标 本次搭建目标&#xff1a; 每天定时把服务器数据备份到备份服务器备份完成后进行校验把过期数据…...

网络安全售前入门09安全服务——安全加固服务

目录 1.服务概述 2.流程及工具 2.1服务流程 2.2服务工具 3.服务内容 ​​​​​​​4.服务方式 ​​​​​​​5.风险规避措施 ​​​​​​​6.服务输出 1.服务概述 安全加固服务是参照风险评估、等保测评、安全检查等工作的结果,基于科学的安全思维方式、长期的安全…...

【Android】GreenDao数据库的使用方式

需求 使用GreenDao数据库进行数据的存储。 介绍 GreenDao 是一个轻量级的对象关系映射&#xff08;ORM&#xff09;库&#xff0c;用于简化 Android 应用中的数据库操作。它提供了以下主要功能&#xff1a; 简化数据库操作&#xff1a;通过注解定义实体类&#xff0c;Green…...

搜索算法之线性搜索详细解读(附带Java代码解读)

1. 基本概念 线性搜索&#xff08;Linear Search&#xff09;&#xff0c;也称为顺序搜索&#xff0c;是一种在列表中查找特定元素的算法。它从列表的第一个元素开始&#xff0c;逐个检查每个元素&#xff0c;直到找到目标元素或检查完所有元素。 2. 工作原理 线性搜索的操作…...

Quartz.Net_依赖注入

简述 有时会遇到需要在IJob实现类中依赖注入其他类或接口的情况&#xff0c;但Quartz的默认JobFactory并不能识别具有有参构造函数的IJob实现类&#xff0c;也就无法进行依赖注入 需要被依赖注入的类&#xff1a; public class TestClass {public TestClass(Type jobType, s…...

【系统架构设计师-2011年】综合知识-答案及详解

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1题】【第2~4题】【第5~7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18~19题】【第20~21题】【第22题】【第23题】【第24题】【第25题】【第2…...

World of Warcraft [CLASSIC][80][Grandel]Sapphire Hive Drone

Sapphire Hive Drone 蓝玉虫巢雄蜂 蓝玉虫巢巨峰 索拉查盆地 实用性不强&#xff0c;好看是好看&#xff0c;模型很大&#xff0c;无奈栏位太少...

Unity 对接 Android 第三方广告,App 切换到后台后,再次打开时,第三方广告被销毁导致无法触发回调逻辑的问题

该问题是由发行进行游戏测试时遇到并反馈的。大致情况如下&#xff1a; 1. 当触发了插屏广告后&#xff0c;在关闭广告前将 App 切换到后台&#xff0c;之后再次打开 App&#xff0c;此时插屏广告消失&#xff0c;并切游戏卡死。 2. 当触发激励视频广告后&#xff0c;在广告展…...

Kafka Broker处于高负载状态(例如消息处理量大或系统资源不足),无法及时响应消费者的请求

Caused by: org.apache.kafka.common.errors.TimeoutException: Timeout of 60000ms expired before the position for partition activity-0 could be determined。 出现这个错误的原因是Kafka消费者在尝试获取分区(activity-0)的位置信息时&#xff0c;超时了。在60秒内无法确…...

相关二叉树进阶面试题的讲解?看这一篇足矣

引子&#xff1a;我们在之前学过c语言的二叉树&#xff0c;但是c来做更好&#xff01;本期要讲的题目如下(其实有点拖欠了&#xff0c;很久之前&#xff0c;就想写这个了&#xff0c;今天终于克服自己的欲望&#xff0c;达成了这个愿望&#xff09; 1&#xff0c; 二叉树创建字…...

Nginx部署前端Vue项目的深度解析

目录 一、准备工作 1.1 开发环境 1.2 服务器环境 1.3 Nginx安装 二、构建Vue项目 三、上传静态文件到服务器 四、配置Nginx 五、测试并重新加载Nginx 六、访问Vue应用 七、高级配置 7.1 启用HTTPS 7.2 启用Gzip压缩 7.3 缓存控制 八、常见问题与解决方案 8.1 40…...

PHP一站式解决方案高级房产系统小程序源码

一站式解决方案&#xff0c;高级房产系统让房产管理更轻松 &#x1f3e0;【开篇&#xff1a;告别繁琐&#xff0c;迎接高效房产管理新时代】&#x1f3e0; 你是否还在为房产管理的繁琐流程而头疼&#xff1f;从房源录入、客户咨询到合同签订、售后服务&#xff0c;每一个环节…...

轻量级模型解读——EfficientNet系列

EfficientNet自2019年谷歌提出以来&#xff0c;经历了三个版本&#xff0c;2019EfficientNet ——> 2020EfficientNet-Lite——> 2021EfficientNetv2 文章目录 1、EfficientNet2、EfficientNetv23、EfficientNet-Lite 对于EfficientNet和EfficientNetv2的解读可见另外两篇…...

深入浅出SRS—RTMP实现

RTMP 直播是 SRS 最典型的使用场景&#xff0c;客户端使用 RTMP 协议向 SRS 推流&#xff0c;使用 RTMP 协议从 SRS 拉流&#xff0c;SRS 作为一个 RTMP 直播服务器实现媒体的转发。同时&#xff0c;RTMP 是 SRS 的中转协议&#xff0c;其他协议之间的互通需要先转为 RTMP&…...

睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩

日前&#xff0c;在先楫HPM6E00技术日上&#xff0c;睿赛德科技&#xff08;RT-Thread&#xff09;向广大工业用户展示了多年来双方在RISC-V生态领域的合作历程和成果&#xff0c;同时睿赛德科技携手先楫半导体首次推出了基于HPM6800处理器的EtherCAT主站解决方案&#xff0c;吸…...

【Cesium实体创建】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Cesium目录 前言一、Cesium二、点 线 实体1.点实体2.线实体 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不…...

Habitat入门教程:如何构建你的第一个自动化应用包

Habitat入门教程&#xff1a;如何构建你的第一个自动化应用包 【免费下载链接】habitat Modern applications with built-in automation 项目地址: https://gitcode.com/gh_mirrors/hab/habitat Habitat是一个现代化的应用自动化平台&#xff0c;它通过内置的自动化功能…...

告别虚拟机!在Windows 11的WSL2里搞定RK3588交叉编译环境(基于gcc-linaro-7.5.0)

在Windows 11的WSL2中高效搭建RK3588交叉编译环境 对于嵌入式开发者来说&#xff0c;为RK3588这样的ARM架构处理器搭建交叉编译环境是日常工作的重要一环。传统方式往往需要在物理机安装Linux系统或使用虚拟机&#xff0c;但这两种方案都存在明显的效率瓶颈。本文将介绍如何利用…...

AI赋能前端开发:让快马平台智能生成仪表盘页面架构与代码

最近在做一个数据可视化项目时&#xff0c;遇到了一个典型的前端开发需求&#xff1a;需要快速搭建一个专业级的仪表盘页面。这个页面需要包含数据概览卡片、图表展示区和用户留言列表三大核心模块。作为一个独立开发者&#xff0c;既要考虑UI美观度&#xff0c;又要兼顾代码质…...

Firmament (FMT):以模型驱动重塑开源飞控开发范式

1. 为什么我们需要重新思考飞控开发方式 第一次接触无人机飞控开发的朋友&#xff0c;往往会被复杂的代码和调试过程吓到。传统开发模式下&#xff0c;开发者需要手动编写大量C/C代码来实现控制算法&#xff0c;调试时又得反复烧录固件、实地试飞。我见过不少团队花费80%时间在…...

SEO排名培训对个人和企业有什么区别

SEO排名培训对个人和企业的不同影响 在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为提升网络曝光度的关键手段。无论是个人博主、自由职业者&#xff0c;还是中小企业&#xff0c;SEO排名培训都能带来显著的效益。SEO排名培训对个人和企业的具体…...

利用快马ai快速构建b站直播弹幕互动界面原型

最近在B站看A8芯片相关的科技直播时&#xff0c;突然想到如果能快速做个直播辅助工具的原型该多方便。作为一个喜欢折腾的前端开发者&#xff0c;我尝试用InsCode(快马)平台来验证这个想法&#xff0c;整个过程比想象中顺利很多。 原型设计思路 核心需要三个区域&#xff1a;左…...

跨平台创意工坊下载工具:突破游戏平台限制的开源解决方案

跨平台创意工坊下载工具&#xff1a;突破游戏平台限制的开源解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 当你在Epic Games平台免费领取了《求生之路2》&#xff0c…...

如何用百元电视盒子打造你的第一台Linux服务器?这个开源项目让你轻松上手!

如何用百元电视盒子打造你的第一台Linux服务器&#xff1f;这个开源项目让你轻松上手&#xff01; 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x…...

从安装到实战:在快马生成项目中体验openclaw本地安装与即时数据抓取

从安装到实战&#xff1a;在快马生成项目中体验openclaw本地安装与即时数据抓取 最近在做一个数据采集的小项目&#xff0c;需要从网站上抓取一些公开信息。经过调研发现openclaw这个工具很适合我的需求&#xff0c;但网上关于它的本地安装和实际应用的完整教程比较少。于是我…...

Java气象数据处理实战:从NC文件到JSON的完整避坑指南(附NetCDF 5.5.2配置技巧)

Java气象数据处理实战&#xff1a;从NC文件到JSON的完整避坑指南 气象数据作为科学研究和商业应用的重要基础&#xff0c;其处理流程的效率和准确性直接影响最终分析结果。NetCDF&#xff08;Network Common Data Form&#xff09;作为气象领域的标准数据格式&#xff0c;以其多…...