优先级继承和优先级天花板(pthread_mutexattr_setprotocol)

优先级继承和优先级天花板,均可以解决优先级翻转问题。

优先级翻转:

实例观察优先级翻转和优先级继承现象-CSDN博客

如果有两个线程A和B,A的优先级大于B的优先级。在B获取锁之后,释放锁之前,A想要获取锁,这个时候,如果B线程没有被其它线程抢占,正在运行,那么A等待B执行完毕即可,符合预期,既然用户实现了这样的业务,即两个不同优先级的线程会抢一个锁,那么就要有这样的预期。而如果这个时候出现了第三个线程C,C的优先级大于B,小于A,那么这个时候C会抢占B的执行,这种现象导致的结果才是不符合预期的。优先级翻转说的是后者这种现象。

优先级继承和优先级天花板是解决优先级翻转的两种方法。在用户态使用互斥体pthread_mutex_t时,可以设置参数来指定使用优先级继承协议还是优先级天花板协议。

优先级继承:

  pthread_mutexattr_init(&mutex_attr);
  pthread_mutexattr_setprotocol(&mutex_attr, PTHREAD_PRIO_INHERIT);
  pthread_mutex_init(&mutex, &mutex_attr);

在B获取锁之后,释放锁之前,A想要获取锁,这个时候为了让B尽快执行完,会将A的优先级提升到B的优先级。提升B的优先级,让B尽快执行完,尽快释放锁。如下代码可以观察到优先级继承现象。low现成首先获取到锁,之后mid执行,之后high要获取锁,此时low的优先级调整到high的优先级。

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif#include <linux/types.h>
#include <sched.h>
#include <stdio.h>
#include <string.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <mutex>#define BIND_CPU_CORE 2pthread_mutex_t mutex;
pthread_mutexattr_t mutex_attr;int set_fifo(int prio) {struct sched_param sp = {.sched_priority = prio};int policy = SCHED_FIFO;return sched_setscheduler(0, policy, &sp);
}int32_t set_affinity() {cpu_set_t cpuset;CPU_ZERO(&cpuset);CPU_SET(BIND_CPU_CORE, &cpuset);if (sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0) {printf("bind cpu error\n");return -1;}return 0;
}void *fifo_low(void *data) {pthread_setname_np(pthread_self(), "low");set_fifo(5);set_affinity();printf("fifo low\n");sleep(1);printf("fifo low, before lock\n");pthread_mutex_lock(&mutex);int count = 0;for (int i = 0; i < 60; i++) {count++;printf("low count %d\n", count);sleep(1);}printf("fifo low, after lock\n");while (1);
}void *fifo_mid(void *data) {pthread_setname_np(pthread_self(), "mid");set_fifo(10);set_affinity();printf("fifo mid\n");sleep(1);while (1);
}void *fifo_high(void *data) {pthread_setname_np(pthread_self(), "high");set_fifo(15);set_affinity();printf("fifo high\n");sleep(1);printf("fifo high, before lock\n");pthread_mutex_lock(&mutex);printf("fifo high, after lock\n");while (1);
}int main() {pthread_t fifo_tid1;pthread_t fifo_tid2;pthread_t fifo_tid3;pthread_mutexattr_init(&mutex_attr);pthread_mutexattr_setprotocol(&mutex_attr, PTHREAD_PRIO_INHERIT);pthread_mutex_init(&mutex, &mutex_attr);sleep(5);pthread_create(&fifo_tid1, NULL, fifo_low, NULL);sleep(5);pthread_create(&fifo_tid2, NULL, fifo_mid, NULL);sleep(30);pthread_create(&fifo_tid3, NULL, fifo_high, NULL);sleep(1000);return 0;
}

优先级继承适用于实时线程之间,以及实时线程和普通线程之间,不适用于普通线程之间。线程设置为了普通调度策略,那么说明对实时性没有要求,那么也没有必要进行优先级继承。

优先级天花板:

假如用户知道使用锁的线程的最高优先级是30,那么可以设置优先级天花板是30。那么不管哪个线程获取到锁,或者在等待锁,那么线程的优先级都是调整为30。

pthread_mutex_t 默认支持优先级继承,std::mutex不支持优先级继承:

在linux下pthread_mutex_t,如果不通过pthread_mutexattr_setprotocol设置协议,那么默认为优先级继承协议。c++中的std::mutex不支持优先级继承,所以在使用c++开发应用时,如果对实时性有要求,那么可以使用pthred_mutex_t。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84693.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark on Hive表结构变更

Spark on Hive表结构变更 1、表结构变更概述1、表结构变更概述 在Spark on Hive架构中,表结构(Schema)变更是一个常见且重要的操作。理解其背景、使用场景以及具体方式对于大数据平台管理至关重要 1.1、Spark on Hive元数据管理 Hive Metastore(HMS): 核心组件。它是一个…

NotePad++ 怎么没有找到插件管理?

今天想使用NotePad阅读markdown文档&#xff0c;却发现未安装插件&#xff0c;本想通过插件管理安装一下&#xff0c;结果没有插件管理&#xff01;&#xff01;&#xff01;&#xff01; 我发现帮助菜单里面有一个入口 可惜的是网页无法打开。。。 只能自己下载插件了。 将插件…

内容搜索软件AnyTXT.Searcher忘记文件名也能搜,全文检索 1 秒定位文件

各位文件搜索小能手们&#xff01;你们有没有过这种糟心事儿&#xff0c;想找个文件&#xff0c;死活想不起文件名&#xff0c;在电脑里一顿乱翻&#xff0c;眼睛都找瞎了也没找到。今天我就给你们介绍一款神器——AnyTXT.Searcher&#xff0c;它可是免费的全文检索工具&#x…

uniapp实现像qq消息列表左滑显示右侧操作栏效果

先看效果图 代码 SlidableChatEntry.vue <template><!-- 聊天项列表 --><view class"chat-item"touchstart"handleTouchStart($event)"touchmove"handleTouchMove($event)"touchend"handleTouchEnd()"><!-- 聊…

收集了一些用python做mysql增删改查的资料

还是因为最近在开发fastapi应用、现在需要把一些关键信息存库&#xff0c;所以就很想要一些这方面的资料。我这里找到一些&#xff0c;希望你看了帖子能节省一些时间。 前边说过如何搭建fastapi开发环境&#xff0c;帖子链接为&#xff1a; https://blog.csdn.net/weixin_4298…

嵌入式软件面经(一)Q: 什么是Modbus协议?它有哪些特点?

Modbus协议是一种开放式的工业通讯协议&#xff0c;最初由Modicon公司&#xff08;现施耐德电气Schneider Electric&#xff09;于1979年开发&#xff0c;广泛应用于工业现场设备之间的数据通讯&#xff0c;尤其适用于PLC&#xff08;可编程逻辑控制器&#xff09;与现场仪表、…

Java-52 深入浅出 Tomcat SSL工作原理 性能优化 参数配置 JVM优化

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月13日更新到&#xff1a; AI炼丹日志-29 - 字节…

day44-硬件学习之arm启动代码

一、跳转指令实现函数调用 LR&#xff08;链接寄存器&#xff09;&#xff1a;保留函数返回地址 1.1 bl指令 跳转指令bl,使LR保存当前函数进入前的下一条指令的地址&#xff0c;使函数调用后可以返回下一条指令的地址&#xff1b; 1.2 bx指令 跳到目标地址&#xff1b; 1.3 栈…

【数据结构】七种常见排序算法

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 欢迎来到排序算法的学习&#xff0c;恭喜你&#xff01;本期内容主要介绍排序算法&#xff0c;一起来探索吧~ &#xf…

Spring AOP 代理模式解析

一、核心概念&#xff1a;代理模式就像房屋中介 想象你要租一套房子&#xff1a; 你&#xff1a;租客&#xff08;业务调用者&#xff09;房东&#xff1a;房主&#xff08;真实业务对象&#xff09;中介&#xff1a;代理对象 传统方式&#xff08;无代理&#xff09; 租客…

智能制造——案例解读16页制造业指标体系搭建指导【附全文阅读】

文档的主要内容可以总结如下&#xff1a; **文档概述**&#xff1a; 本文档详细探讨了企业为何需要指标体系、指标体系的定义、如何搭建指标体系、如何有效拆解和管理指标&#xff0c;并最后提供了制造业指标体系的参考。 **主要内容**&#xff1a; 1. **企业为什么需要指标体系…

Pandas 数据清洗

数据清洗是数据分析过程中至关重要的一环&#xff0c;也是初学者最容易忽视的步骤。本文将详细介绍如何使用Pandas进行数据清洗&#xff0c;涵盖空值处理、日期格式修正、错误数据识别和重复数据删除四大核心内容。 1. Pandas 清洗空值 空值是数据集中最常见的问题之一&#…

C++容器之 forward_list (单向链表)使用说明

目录 1. 语法格式 2. 说明 3. 用法示例 1. 语法格式 描述控制可变长度元素序列的对象。该序列存储为单向(前向)链接的节点列表&#xff0c;每个节点包含一个 Type 类型的成员。 template <class Type, class Allocator allocator<Type>> class forward_lis…

ali 轻量服务器安装nginx

# Ubuntu sudo apt install nginx-light # 精简版 # CentOS sudo yum install nginx #启动并设置开机自启 sudo systemctl daemon-reload sudo systemctl start nginx sudo systemctl enable nginx #验证安装 nginx -v curl -I 127.0.0.1 #常用命令&#xff1a; # 重新加载配…

【设计模式】4.代理模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 代理模式 1. 第一版 class SchoolGirl:def __init__(self):self._name Nonepropertydef name(self):return self._namename.setterdef name(self, valu…

基于微信小程序的美食点餐订餐系统

文章目录 1. 项目概述2. 项目思维导图3. 系统架构特点4. 核心模块实现代码1. 登录注册2. 首页模块实现4. 分类模块实现5. 购物车模块实现6. 订单模块实现 5. 注意事项6. 项目效果截图7. 关于作者其它项目视频教程介绍 1. 项目概述 在移动互联网时代&#xff0c;餐饮行业数字化…

[neo4j]介绍4个开源的知识图谱项目

项目主要介绍几个开源项目&#xff1a; QASystemOnMedicalKG&#xff1a;医疗知识图谱问答 https://github.com/liuhuanyong/QASystemOnMedicalKG Agriculture_KnowledgeGraph&#xff1a;农业知识图谱 Financial-Knowledge-Graphs&#xff1a;小型金融知识图谱 stock-know…

20倍光学镜头怎么实现20+20倍数实现

1. 硬件选择 球机摄像头 选择40倍光学变焦的摄像头 &#xff1a;确保摄像头具有足够的变焦能力&#xff0c;同时考虑摄像头的分辨率、帧率、夜视功能等。 内置云台 &#xff1a;许多高端摄像头已经内置了云台功能&#xff0c;如果是这样&#xff0c;可以简化机械设计和电机控制…

Axios 在 Vue3 项目中的使用:从安装到组件中的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

【Python打卡Day50】预训练模型与CBAM注意力@浙大疏锦行

现在我们思考下&#xff0c;是否可以对于预训练模型增加模块来优化其效果&#xff0c;这里我们会遇到一个问题: 预训练模型的结构和权重是固定的&#xff0c;如果修改其中的模型结构&#xff0c;是否会大幅影响其性能。其次是训练的时候如何训练才可以更好的避免破坏原有的特征…