当前位置: 首页 > 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
http://www.lryc.cn/news/431818.html

相关文章:

  • 【日常记录-Java】SpringBoot中使用无返回值的异步方法
  • 【深度学习】多层感知机的从零开始实现与简洁实现
  • 4、Django Admin对自定义的计算字段进行排序
  • rsync搭建全网备份
  • 网络安全售前入门09安全服务——安全加固服务
  • 【Android】GreenDao数据库的使用方式
  • 搜索算法之线性搜索详细解读(附带Java代码解读)
  • Quartz.Net_依赖注入
  • 【系统架构设计师-2011年】综合知识-答案及详解
  • World of Warcraft [CLASSIC][80][Grandel]Sapphire Hive Drone
  • Unity 对接 Android 第三方广告,App 切换到后台后,再次打开时,第三方广告被销毁导致无法触发回调逻辑的问题
  • Kafka Broker处于高负载状态(例如消息处理量大或系统资源不足),无法及时响应消费者的请求
  • 相关二叉树进阶面试题的讲解?看这一篇足矣
  • Nginx部署前端Vue项目的深度解析
  • PHP一站式解决方案高级房产系统小程序源码
  • 轻量级模型解读——EfficientNet系列
  • 深入浅出SRS—RTMP实现
  • 睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩
  • 【Cesium实体创建】
  • 为何一些包的Priority在apt-cache和deb文件当中的不一样
  • CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)
  • nvidia-cuda-tensorrt-cudnn下载网站
  • GitLab 是什么?GitLab使用常见问题解答
  • 数字时代,寻找新的生意增长点之前要做什么准备?
  • 使用Python本地搭建http.server文件共享服务并实现公网环境远程访问——“cpolar内网穿透”
  • STM32——Flash闪存
  • python科学计算:NumPy 数组的高级操作
  • 【补-网络安全】日常运维(二)终端端口占用排查
  • 设计模式之适配器模式:软件世界的桥梁建筑师
  • Java 入门指南:Java 并发编程 —— Fork/Join 框架 实现任务的拆分与合并