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

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

优先级反转(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.kler.cn/a/292081.html

相关文章:

  • 深入探索 Kubernetes 安全容器:Kata Containers 与 gVisor
  • node对接ChatGpt的流式输出的配置
  • springboot接口返回数据给前端,BigDecimal为null但返回前端显示-1
  • 前后端分离练习(云客项目)
  • 计算机视觉 ---常见图像文件格式及其特点
  • Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!
  • 搜维尔科技:使用Facewaer面部捕捉系统制作栩栩如生的脸部动画
  • Maven 的 pom.xml 文件中<dependency> 元素及其各个参数的解释
  • EmguCV学习笔记 C# 10.1 人脸检测 CascadeClassifier类
  • C语言猜数小游戏
  • SpringBoot2:请求处理原理分析-请求Path与接口的映射关系(HandlerMapping)
  • 51单片机——蜂鸣器
  • Springboot +vue 网络零食商城系统
  • 828华为云征文:华为云 Flexus X 实例性能测评——SuperBench 一键窥见性能
  • 数据丢失要怎么处理,助你一键恢复数据
  • 算法笔试-编程练习-好题-02
  • 【操作系统】线程同步之互斥量
  • ssh之登录服务器后,自动进入目录(四十七)
  • ssh登录服务器报错“no matching host key type found. Their offer: ssh-rsa,ssh-dss”解决方法
  • IOS 22 自定义标题栏(Toolbar)
  • 代码随想录 -- 二叉树 -- 翻转二叉树
  • Linux--目录与文件操作函数
  • Leetcode JAVA刷刷站(105)从前序与中序遍历序列构造二叉树
  • SpringBoot 集成 kafka,并消费历史事件
  • Hive 安装
  • 如何选到好的宠物空气净化器,用哪款宠物空气净化器比较好?