讲师中心 微信公众号
AI工具推荐 视频效率加速

c++ 线程优先级设置 c++ windows和linux如何设置thread priority

酷雪小哥_3982

酷雪小哥_3982

发布时间:2026-03-21 18:51:11

|

613人浏览过

|

来源于php中文网

原创

Windows用SetThreadPriority设线程优先级需有效句柄和权限,仅对当前线程生效;Linux用pthread_setschedparam设调度策略与参数,SCHED_FIFO/RR需root权限;跨平台应避免裸用native_handle(),优先级非性能银弹。

c++ 线程优先级设置 c++ windows和linux如何设置thread priority

Windows 下用 SetThreadPriority 设置线程优先级

Windows 提供了明确的 API 控制线程优先级,但必须注意:它只对当前线程句柄生效,且调用者需有相应权限(比如 SE_INC_BASE_PRIORITY_PRIVILEGE 才能提权到高于 NORMAL 的级别)。普通用户进程默认只能在 IDLE、NORMAL、HIGH 之间调整。

  • SetThreadPriority 必须传入有效的线程句柄,不能直接对 std::thread::native_handle() 返回值裸用——它返回的是 HANDLE,但需确保该句柄未被关闭、且有 THREAD_SET_INFORMATION 权限
  • 常见错误是在线程已启动后才去获取句柄并调用,结果因调度延迟或竞争导致优先级未及时生效;建议在线程函数开头立即调用
  • 优先级常量如 THREAD_PRIORITY_HIGHEST、THREAD_PRIORITY_ABOVE_NORMAL 是相对进程基准的偏移量,不是绝对值;整个进程的基准由 SetPriorityClass 决定(比如 REALTIME_PRIORITY_CLASS 风险极高,普通应用禁用)
  • 示例片段:
    auto th = std::thread([] {
        SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
        // 后续工作...
    });

Linux 下用 pthread_setschedparam 设置线程调度策略和优先级

Linux 不叫“线程优先级”,而是“调度参数”,由调度策略(SCHED_FIFO、SCHED_RR、SCHED_OTHER)和对应策略下的优先级数值共同决定。普通用户只能用 SCHED_OTHER,此时优先级固定为 0,真正可调的是 nice 值(-20 到 +19),但它影响的是 CPU 时间片权重,不是实时优先级。

  • 想用 SCHED_FIFO 或 SCHED_RR?必须有 CAP_SYS_NICE 能力(通常需 root 或 sudo setcap cap_sys_nice+ep ./your_app)
  • pthread_setschedparam 第二个参数是 sched_param 结构体,其中 sched_priority 在 SCHED_OTHER 下会被忽略,在 SCHED_FIFO/SCHED_RR 下才有效(取值范围取决于 sysconf(_SC_PRIORITY_MIN) 和 sysconf(_SC_PRIORITY_MAX),通常是 1–99)
  • 常见错误:没调用 pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) 就直接设参,结果被继承父线程调度策略覆盖
  • 示例(需 root 或能力):
    struct sched_param param;
    param.sched_priority = 50;
    pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);

跨平台封装时别碰 std::thread::native_handle() 的类型细节

C++ 标准不保证 std::thread::native_handle() 的具体类型,Windows 返回 HANDLE,Linux 返回 pthread_t。硬写 #ifdef _WIN32 分支容易漏掉头文件依赖、链接库(libpthread)、或权限检查逻辑。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 更稳妥的做法是:把线程创建和优先级设置绑定在一起,在构造线程对象时就完成 native 层设置,避免后续再取 handle
  • 不要试图把 native_handle() 存起来延后设置——Linux 的 pthread_t 在线程退出后可能复用,Windows 的 HANDLE 可能已被关闭
  • 如果必须跨平台抽象,建议封装成两个独立函数:set_thread_priority_win32(HANDLE) 和 set_thread_priority_linux(pthread_t),而非一个泛型模板

优先级不是性能银弹,反而容易引发饥饿或抖动

提高某线程优先级,不代表它就“跑得更快”;它只是更早被调度器选中。如果高优线程频繁阻塞(比如等锁、等 I/O),或者和其它高优线程争抢资源,实际吞吐可能更差。

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

  • Windows 上 REALTIME_PRIORITY_CLASS 会抢占系统线程(包括鼠标、音频),导致整机假死,调试都困难
  • Linux 上 SCHED_FIFO 线程若不主动让出 CPU(如 sched_yield() 或阻塞),会饿死同优先级及更低优先级的所有线程
  • 绝大多数场景下,用好线程池 + 任务优先级队列(应用层调度),比操作系统级优先级更可控、更易测试
事情说清了就结束。真正需要调 OS 级线程优先级的,往往已经踩进实时性或资源争抢的深水区,这时候光改一个参数没用,得看整个线程模型和同步原语的设计。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

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

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

5924

2023.10.24

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4354

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4491

2025.07.04

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

351

2026.03.13

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

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

3858

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

543

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3119

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2678

2023.07.27

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn