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

酷雪小哥_3982

酷雪小哥_3982

2026-03-21

613人浏览

原创

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 时间片权重,不是实时优先级。

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

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

下载
  • 想用 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)、或权限检查逻辑。

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

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

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

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

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

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

相关专题

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

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

2023.10.24

5904

49

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

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

2025.06.09

4314

18

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

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

2025.07.04

4451

25

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

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

2026.03.13

331

19

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

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

2023.08.10

3818

6

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

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

2025.12.01

543

16

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

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

2023.07.26

3119

3

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

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

2023.07.27

2678

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1448

3

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习