優先級繼承和優先級天花板(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
英文地址,請注明出處:http://en.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;是否會大幅影響其性能。其次是訓練的時候如何訓練才可以更好的避免破壞原有的特征…