线程优先级设置必须通过操作系统api实现,不能直接用std::thread;windows需在子线程内调用setthreadpriority并配合setpriorityclass,linux需配对调度策略与参数,且注意权限、继承和取值范围。

不能靠 std::thread 直接设,必须用操作系统 API;设错位置、权限不足、调度策略没配对,线程优先级大概率无效。
Windows 下用 SetThreadPriority 必须在子线程内调用
很多人误在主线程里对刚创建的 std::thread 对象调用 SetThreadPriority,但此时子线程可能还没真正启动,句柄也未必有效。更糟的是,GetCurrentThread() 返回的是当前调用线程(即主线程)的句柄,不是子线程的。
- 正确做法:把优先级设置逻辑写进线程函数第一行,用
GetCurrentThread()获取自身句柄 -
THREAD_PRIORITY_HIGHEST不等于“实时”,它只是相对于进程基准的偏移;若想真正高响应,得先调SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS) -
REALTIME_PRIORITY_CLASS极其危险——一旦出错可能冻结整个系统,普通应用禁止使用 - 普通用户进程默认只能在
THREAD_PRIORITY_IDLE到THREAD_PRIORITY_HIGHEST之间调整,THREAD_PRIORITY_TIME_CRITICAL需要 SE_INC_BASE_PRIORITY_PRIVILEGE 权限
Linux 下 pthread_setschedparam 要配对调度策略
Linux 没有“线程优先级”这个独立概念,只有“调度策略 + 参数”。只改 sched_priority 值而忽略策略,基本无效。
- 普通用户只能用
SCHED_OTHER,此时sched_priority固定为 0,真正能调的是nice值(-20 到 +19),但它影响权重,不保证抢占 - 要用
SCHED_FIFO或SCHED_RR?必须有CAP_SYS_NICE能力,常见做法是sudo setcap cap_sys_nice+ep ./your_app - 别忘了显式禁用继承:
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED),否则新线程会直接继承父线程策略,你设的参数被无视 -
sched_priority取值范围不是固定 1–99,得查sysconf(_SC_PRIORITY_MIN)和sysconf(_SC_PRIORITY_MAX),不同内核版本可能不同
跨平台封装时别碰 native_handle() 的类型细节
std::thread::native_handle() 在 Windows 返回 HANDLE,Linux 返回 pthread_t,二者完全不兼容。强行做类型转换或 void* 中转,编译可能过,运行必崩。
- 推荐用条件编译隔离:Windows 分支调
SetThreadPriority,Linux 分支调pthread_setschedparam,接口统一成一个函数,内部不暴露 handle 类型 - 不要试图把
native_handle()存起来等稍后设置——线程启动后句柄可能失效,尤其 Windows 上 HANDLE 是可关闭资源 - 优先级不是性能银弹:设太高反而导致低优先级线程饿死,尤其在单核或资源紧张环境;建议按任务周期和关键性分级,比如传感器采样设 80,日志写入设 20
最常被忽略的一点:优先级生效的前提是线程已进入可调度状态。如果线程刚创建就立刻 join,或者卡在 mutex、sleep、IO 上,再高的优先级也毫无意义。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











