0

0

c++怎么设置线程优先级与cpu亲和性_c++ 多核处理器性能绑定【指南】

穿越時空

穿越時空

发布时间:2026-01-01 18:47:02

|

161人浏览过

|

来源于php中文网

原创

Linux下需用pthread_setschedparam设置线程优先级,仅std::thread对象无效;须root权限或CAP_SYS_NICE能力才能设SCHED_FIFO/RR实时策略,优先级范围1–99;绑定CPU用pthread_setaffinity_np,需检查CPU在线状态及错误码。

c++怎么设置线程优先级与cpu亲和性_c++ 多核处理器性能绑定【指南】

Linux 下用 pthread_setschedparam 设置线程优先级

在 Linux 中,C++ 线程(std::thread)底层通常基于 pthread,但标准库不暴露调度参数接口,必须用原生 pthread 函数操作。直接调用 pthread_setschedparam 才能真正生效,仅改 std::thread 对象本身无效。

注意:需要 root 权限或 CAP_SYS_NICE 能力才能提升实时优先级(如 SCHED_FIFO),否则会静默失败或返回 EPERM

  • 先用 pthread_self() 获取当前线程 ID,再传给 pthread_setschedparam
  • 策略选 SCHED_FIFOSCHED_RR 才支持优先级(SCHED_OTHERpriority 必须为 0)
  • 优先级范围依赖策略:SCHED_FIFO 通常为 1–99,可通过 sched_get_priority_min/max(SCHED_FIFO)
struct sched_param param;
param.sched_priority = 50;
int result = pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
if (result != 0) {
    // 检查 errno,常见为 EPERM(权限不足)或 EINVAL(策略/优先级非法)
}

绑定线程到指定 CPU 核心用 pthread_setaffinity_np

pthread_setaffinity_np 是 GNU 扩展,非 POSIX 标准,但 Linux 上稳定可用。它控制线程只能在指定 CPU 核心上运行,避免跨核迁移开销,对低延迟场景关键。

容易踩的坑:CPU 编号从 0 开始,且需确认系统实际核心数(nproc/sys/devices/system/cpu/online),绑到不存在的 CPU 会失败;另外,亲和性设置对子线程不继承,每个线程需单独设。

立即学习C++免费学习笔记(深入)”;

Kacha
Kacha

KaCha是一款革命性的AI写真工具,用AI技术将照片变成杰作!

下载
  • cpu_set_t 类型构造掩码,CPU_ZERO 清空,CPU_SET(2) 表示启用 CPU 2
  • 调用前确保目标 CPU 处于 online 状态(热插拔可能使某些 core offline)
  • 若程序运行时被系统调度器抢占到其他核,说明亲和性未生效——大概率是没正确调用或返回值未检查
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(1, &cpuset); // 绑定到 CPU 1
int result = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
if (result != 0) {
    // 检查 errno,常见为 EINVAL(CPU 编号越界)或 ESRCH(线程已退出)
}

std::thread 启动后如何安全获取并设置 pthread 层属性

std::thread 不提供公开的 native_handle() 类型定义,但标准允许其返回可转换为 pthread_t 的类型(GCC/Clang 下就是 pthread_t)。只要不依赖 ABI 细节,可直接转型使用。

关键点:必须在线程已启动、但尚未结束时调用,否则 native_handle() 可能为无效值;且不能在 join()detach() 后使用。

  • auto handle = t.native_handle() 获取句柄,再转为 pthread_t
  • 优先级与亲和性设置建议放在新线程函数入口处,而非主线程中调用——避免竞态和时序问题
  • 若线程函数是 lambda,捕获变量需注意生命周期,避免设置时线程已退出

实时调度 + CPU 绑定组合使用的典型陷阱

两者一起用时,性能收益明显,但错误配置反而导致卡死或吞吐暴跌。最常被忽略的是:实时线程若无主动让出(如 usleepnanosleep、阻塞 I/O),会饿死其他进程,尤其当它跑满单核且优先级高于所有普通线程时。

  • 不要把多个高优先级线程绑到同一 CPU 核——它们会互相抢占,失去实时性保障
  • 避免在实时线程中调用可能分配内存、加锁或触发 page fault 的操作(如 std::coutmalloc
  • 测试阶段务必用 taskset -c N ./a.out 验证亲和性是否生效,再用 chrt -f 50 ./a.out 验证调度策略,比代码内调试更直观

真实场景里,优先级数字和 CPU 编号不是写死的常量,应从环境变量配置文件读取,并做存在性校验——这点几乎所有人一开始都会忽略。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

187

2025.11.08

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

989

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

50

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2025.12.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

472

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

472

2023.08.10

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.4万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号