Linux基础 -- pthread 设置线程调度示例

news2025/1/5 11:20:13

pthread 设置调度方式与 pthread_attr_setinheritsched 使用说明

背景

在多线程编程中,线程的调度策略和优先级决定了线程的运行顺序和时间分配。在 Linux 系统中,pthread 库提供了多种调度方式和灵活的优先级设置方法。pthread_attr_setinheritsched 是用于设置线程调度属性继承方式的一个重要接口,它可以控制新创建线程是否继承创建线程的调度属性。

本文将介绍如何使用 pthread 设置线程调度为 SCHED_RR,并详细说明 pthread_attr_setinheritsched 的使用和注意事项。


线程调度设置

在 Linux 中,线程的调度策略分为以下几种:

  • SCHED_RR:实时轮转调度。
  • SCHED_FIFO:先到先服务调度。
  • SCHED_OTHER:默认的非实时调度。

通过 pthread 可以为线程设置特定的调度策略和优先级,以下是示例代码:

#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>

void *thread_function(void *arg) {
    printf("Thread with SCHED_RR and priority running...\n");
    while (1) {
        // 模拟任务
    }
    return NULL;
}

int main() {
    pthread_t thread;
    struct sched_param param;
    pthread_attr_t attr;

    // 初始化线程属性
    if (pthread_attr_init(&attr) != 0) {
        perror("pthread_attr_init");
        return EXIT_FAILURE;
    }

    // 设置线程调度策略为 SCHED_RR
    if (pthread_attr_setschedpolicy(&attr, SCHED_RR) != 0) {
        perror("pthread_attr_setschedpolicy");
        return EXIT_FAILURE;
    }

    // 设置线程优先级
    param.sched_priority = 10; // 优先级值,范围根据系统配置(一般1~99)
    if (pthread_attr_setschedparam(&attr, &param) != 0) {
        perror("pthread_attr_setschedparam");
        return EXIT_FAILURE;
    }

    // 确保属性设置为显式继承
    if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) != 0) {
        perror("pthread_attr_setinheritsched");
        return EXIT_FAILURE;
    }

    // 创建线程
    if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {
        perror("pthread_create");
        return EXIT_FAILURE;
    }

    // 销毁线程属性
    pthread_attr_destroy(&attr);

    // 等待线程结束(可选)
    pthread_join(thread, NULL);

    return EXIT_SUCCESS;
}

pthread_attr_setinheritsched 使用说明

pthread_attr_setinheritsched 用于设置新线程的调度属性继承方式,其主要选项包括:

  • PTHREAD_INHERIT_SCHED:新线程继承创建线程的调度属性(包括调度策略和优先级)。
  • PTHREAD_EXPLICIT_SCHED:新线程显式使用线程属性对象中设置的调度属性。

示例代码

以下示例展示了两种继承方式的区别:

#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>

void *thread_function(void *arg) {
    struct sched_param param;
    int policy;

    // 获取当前线程的调度属性
    pthread_getschedparam(pthread_self(), &policy, &param);
    printf("Thread Policy: %s, Priority: %d\n",
           (policy == SCHED_RR) ? "SCHED_RR" :
           (policy == SCHED_FIFO) ? "SCHED_FIFO" :
           "SCHED_OTHER", param.sched_priority);

    return NULL;
}

int main() {
    pthread_t thread;
    pthread_attr_t attr;
    struct sched_param param;

    // 初始化线程属性
    pthread_attr_init(&attr);

    // 设置调度策略和优先级
    pthread_attr_setschedpolicy(&attr, SCHED_RR);
    param.sched_priority = 10;
    pthread_attr_setschedparam(&attr, &param);

    // 设置为 EXPLICIT_SCHED,显式使用设置的属性
    pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);

    printf("Creating thread with PTHREAD_EXPLICIT_SCHED...\n");
    pthread_create(&thread, &attr, thread_function, NULL);
    pthread_join(thread, NULL);

    // 设置为 INHERIT_SCHED,继承主线程属性
    pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);

    printf("Creating thread with PTHREAD_INHERIT_SCHED...\n");
    pthread_create(&thread, &attr, thread_function, NULL);
    pthread_join(thread, NULL);

    pthread_attr_destroy(&attr);
    return 0;
}

输出结果

假设主线程的调度策略为 SCHED_OTHER,优先级为 0

Creating thread with PTHREAD_EXPLICIT_SCHED...
Thread Policy: SCHED_RR, Priority: 10

Creating thread with PTHREAD_INHERIT_SCHED...
Thread Policy: SCHED_OTHER, Priority: 0

注意事项

  1. 调度策略权限

    • 设置实时调度策略(如 SCHED_RRSCHED_FIFO)需要管理员权限。可以使用 sudo 或通过 setcap 命令赋予程序权限:
      sudo setcap cap_sys_nice=eip ./your_program
      
  2. 优先级范围

    • 调用 sched_get_priority_minsched_get_priority_max 可获取当前调度策略的优先级范围。
  3. 实时调度风险

    • 实时线程可能抢占所有普通线程,导致系统不响应,应谨慎使用。
  4. 继承策略选择

    • PTHREAD_INHERIT_SCHED 更适合需要统一调度策略的多线程程序。
    • PTHREAD_EXPLICIT_SCHED 适用于需要灵活设置线程调度属性的场景。

总结

通过 pthread 提供的调度属性设置和 pthread_attr_setinheritsched 接口,开发者可以灵活地控制线程的调度方式和优先级。在实际开发中,应根据需求选择合适的调度策略和优先级,并注意权限和实时调度带来的潜在问题。

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

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

相关文章

电脑dll文件丢失怎么恢复,丢失dll文件一键修复教程分享

动态链接库文件&#xff08;DLL&#xff09;是Windows操作系统中至关重要的组成部分&#xff0c;它们包含了许多程序运行所需的函数和资源。当电脑丢失DLL文件时&#xff0c;会导致软件无法正常运行&#xff0c;甚至影响系统的稳定性。本文将从多个角度全面分析解读电脑丢失DLL…

Vue项目整合与优化

前几篇文章&#xff0c;我们讲述了 Vue 项目构建的整体流程&#xff0c;从无到有的实现了单页和多页应用的功能配置&#xff0c;但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案&#xff0c;就像大楼造完需要进行最后的项目验收改进一样&#xff0c;有待我们进一步…

面向机器学习的Java库与平台

学习Java语言中与机器学习相关的各种库与平台&#xff0c;了解每个库的功能&#xff0c;以及可以用它 们解决的问题。  实现机器学习应用时需要具备的Java环境  Weka&#xff1a;一个通用的机器学习平台  Java机器学习库&#xff1a;一系列机器学习算法  Apache Mah…

SAP SD学习笔记24 - 赠品的两种形式 - 内增Bonus数量、外增Bonus数量

上一章讲了无偿出荷的内容。 SAP SD学习笔记23 - 无偿出荷&#xff08;免费交货&#xff09;与继续无偿出荷&#xff08;继续免费交货&#xff09;-CSDN博客 本章继续将SAP中赠品的两种形式&#xff1a; - 内增Bonus数量&#xff1a;Bonus数量包含在总数量当中&#xff0c;比…

Python跨年烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

深入理解MemCache

随着互联网应用的飞速发展&#xff0c;动态Web应用的性能问题逐渐成为开发者关注的焦点。其中&#xff0c;数据库作为系统性能的关键瓶颈&#xff0c;在用户请求量急剧增加的情况下&#xff0c;往往难以快速响应用户需求。为了解决这一问题&#xff0c;缓存技术应运而生。MemCa…

webrtc 源码阅读 make_ref_counted模板函数用法

目录 1. 模板参数解析 1.1 typename T 1.2 typename... Args 1.3 typename std::enable_if::value, T>::type* nullptr 2. scoped_refptr 3. new RefCountedObject(std::forward(args)...); 4. 综合说明 5.在webrtc中的用法 5.1 peerConnectionFactory对象的构建过…

【MySQL】数据操作

数据操作 一、INSERT1、介绍2、语法3、语法介绍4、注意事项5、示例 二、插入否则更新1、介绍2、语法3、语法介绍4、示例 三、ROW_COUNT1、介绍2、示例 四、REPLACE1、介绍2、语法3、示例 五、UPDATE1、介绍2、语法3、示例 六、DELETE1、介绍2、语法3、语法介绍 七、TRUNCATE1、…

表单元素(标签)有哪些?

HTML 中的表单元素&#xff08;标签&#xff09;用于收集用户输入的数据&#xff0c;常见的有以下几种&#xff1a; 文本输入框 <input type"text">&#xff1a;用于单行文本输入&#xff0c;如用户名、密码等。可以通过设置maxlength属性限制输入字符数&…

基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活

随着科技的飞速发展&#xff0c;智能家居产品正逐步渗透到我们的日常生活中&#xff0c;其中智能闹钟作为时间管理的得力助手&#xff0c;也在不断进化。基于W2605C语音识别与语音合成芯片的智能语音交互闹钟&#xff0c;凭借其强大的联网能力、自动校时功能、实时天气获取、以…

机器学习中回归预测模型中常用四个评价指标MBE、MAE、RMSE、R2解释

在机器学习中&#xff0c;评估模型性能时常用的四个指标包括平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09;、均方误差&#xff08;Mean Squared Error, MSE&#xff09;、均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09;和决定系数&#xf…

Visual Studio 玩转 IntelliCode AI辅助开发

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么&#xff1f;2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID&#xff08;用于位置环&#xff09;&#xff08;1&#xff09;公式&#xff08;2&#xff09;代码使用代码 2. 增量式…

直观解读 JuiceFS 的数据和元数据设计(一)

大家读完觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 JuiceFS 高层架构与组件2 搭建极简 JuiceFS 集群 2.1 搭建元数据集群2.2 搭建对象存储&#xff08;MinIO&#xff09; 2.2.1 启动 MinIO server2.2.2 创建 bucket2.3 下载 juicefs 客户端2.4 创…

数据结构漫游记:静态双向链表

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞+FilesystemObject)

【Web安全】文件写入漏洞 ASP 网页病毒模拟&#xff08;文件写入漏洞FilesystemObject&#xff09; 原理 文件写入漏洞 文件写入漏洞是指攻击者通过某种方式在服务器上创建或修改文件的漏洞。攻击者可以利用此漏洞在服务器上写入恶意代码或文件&#xff0c;从而实现进一步的…

【Unity3d】C#浮点数丢失精度问题

一、float、double浮点数丢失精度问题 Unity3D研究院之被坑了的浮点数的精度&#xff08;一百零三&#xff09; | 雨松MOMO程序研究院 https://segmentfault.com/a/1190000041768195?sortnewest 浮点数丢失精度问题是由于大部分浮点数在IEEE754规范下就是无法准确以二进制…

Browser Use:AI智能体自动化操作浏览器的开源工具

Browser Use:AI智能体自动化操作浏览器的开源工具 Browser Use 简介1. 安装所需依赖2. 生成openai密钥3. 编写代码4. 运行代码5. 部署与优化5.1 部署AI代理5.2 优化与扩展总结Browser Use 简介 browser-use是一个Python库,它能够帮助我们将AI代理与浏览器自动化操作结合起来;…

tcpdump指南(1)

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; tcpdump是一种在网络上转储流量的网络工具。 这篇文章服务器作为一些常用命令的指南。如需完整指南&#xff0c; 请参阅手册页&#xff0c;或在 Linux 计算机上。man tcpdump 1 基本选项 帮助摘要&#…

14. 日常算法

1. 面试题 02.04. 分割链表 题目来源 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 class Solution { public:ListNo…