You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:12:06