在macOS中仍可设置线程亲和性吗?M1设备调用thread_policy_set报错46
M1 macOS上线程亲和性设置失败的原因
你遇到的错误码46对应KERN_INVALID_POLICY,核心原因是:THREAD_AFFINITY_POLICY在Apple Silicon(包括M1系列)的macOS设备上已被废弃,不再支持通过该接口设置线程亲和性。
旧版x86架构的macOS中,THREAD_AFFINITY_POLICY可用于绑定线程到特定核心,但Apple Silicon采用big.LITTLE异构核心设计,macOS的调度系统做了彻底调整——系统会根据线程的QoS(服务质量)等级自动调度到性能核心或效率核心,不再允许用户直接通过亲和性标签绑定线程到特定核心。
如果需要控制线程的调度优先级或核心倾向,推荐使用以下替代方案:
- 调用
pthread_set_qos_class_self_np()为线程设置QoS等级,系统会根据等级调度到对应类型的核心(比如QOS_CLASS_USER_INTERACTIVE会优先调度到性能核心) - 借助GCD(Grand Central Dispatch),通过
dispatch_queue_attr_make_with_qos_class()创建指定QoS的队列,将任务提交到该队列,由系统负责调度
你的原代码在Apple Silicon上无法正常工作,正是因为该接口已被废弃:
mach_port_t thread_port = pthread_mach_thread_np(pthread_self()); thread_affinity_policy_data_t policyData1; policyData1.affinity_tag = 1; int b = 0; kern_return_t t1 = thread_policy_set(thread_port, THREAD_AFFINITY_POLICY, (thread_policy_t)&policyData1, THREAD_AFFINITY_POLICY_COUNT); if (t1 == KERN_SUCCESS) { printf("set cores success"); } else { printf("fail set : %d\n", t1); }
内容的提问来源于stack exchange,提问作者benrush
相关产品推荐
相关产品推荐

