sched_setaffinity()对进程新建线程的CPU核心绑定影响问询
问题1:主进程调用sched_setaffinity()是否会影响后续创建的新线程的运行CPU核心?
会。Linux系统中,线程默认会继承创建它的父线程的CPU亲和性掩码。主线程调用sched_setaffinity()修改的是自身的亲和性规则,后续通过std::thread创建的所有子线程,都会直接继承主线程当前的亲和性配置,默认被限制在绑定的CPU核心范围内运行。
问题2:调用sched_setaffinity()后创建的线程都运行在主进程绑定的核心上,这个表现是否每次执行都稳定可依赖?
可以稳定依赖。这个行为是Linux内核和POSIX线程规范明确定义的继承规则,不属于平台随机特性,只要你没有在代码其他位置主动修改线程亲和性,也没有外部系统规则(比如cgroup、cpuset强制限制CPU范围)修改进程可用核心,这个表现每次运行都完全一致。
问题3:如下伪代码是否可保证threadA、threadB、threadC始终运行在同一核心上?
int main() { sched_setaffinity(...); threadA = std::thread(); threadB = std::thread(); threadC = std::thread(); }
这取决于sched_setaffinity绑定的核心范围:
- 如果调用时传入的亲和性掩码只包含 单个CPU核心,那三个线程都会被限制在这一个核心上运行,符合要求。
- 如果传入的掩码包含多个CPU核心,调度器只会保证三个线程都在掩码覆盖的核心范围内调度,不会强制绑定到同一个核心,三个线程可能运行在不同核心上。
以上结论的前提是程序运行过程中没有其他逻辑修改任意线程的亲和性,也没有系统层面的CPU限制规则覆盖你设置的亲和性配置。
内容的提问来源于stack exchange,提问作者Yaniv G
相关产品推荐
相关产品推荐

