【问题标题】:pthread_create warning on androidandroid上的pthread_create警告
【发布时间】:2026-01-21 11:55:02
【问题描述】:

调用pthread_create 函数后,我收到下一条消息:

W/libc (26409):pthread_create sched_setscheduler 调用失败: 不允许操作

用于创建线程的代码是:

pthread_attr_t threadAttr;
int ret = pthread_attr_init(&threadAttr);
//code to check ret - it's 0

size_t guard_size = 0;
pthread_attr_getguardsize(&threadAttr, &guard_size);
ret = pthread_attr_setstacksize(&threadAttr, myStackSize + guard_size);
//code to check ret - it's 0

ret = pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED);
//code to check ret - it's 0

ret = pthread_attr_setschedpolicy(&threadAttr, SCHED_FIFO);
//code to check ret - it's 0

sched_param  schedParam;
schedParam.sched_priority = myPriority; //it's 16
ret = pthread_attr_setschedparam(&threadAttr, &schedParam);
//code to check ret - it's 0

// Create the thread
ret = pthread_create(&myHandle, &threadAttr, RunCallback, (void *)myData);
//code to check ret - it's 0
//code to check myHandle - it's > 0

// Delete attribute
pthread_attr_destroy(&threadAttr);

请注意,该消息会在 RunCallback 中的断点被命中之前出现在 logcat 中。

你知道我为什么会有这个警告吗?忽略它是否安全 - 如果是,为什么?

PS:代码在具有 4.4.2 操作系统版本(内部版本号 KOT49H)的 Nexus 4 设备上作为本机活动运行。

【问题讨论】:

    标签: android c pthreads thread-priority


    【解决方案1】:

    当您致电pthread_attr_setschedpolicy 时,您要求设置特定的调度策略 (http://man7.org/linux/man-pages/man3/pthread_attr_setschedpolicy.3.html)。您设置的策略SCHED_FIFO 是根据http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html 的实时策略。根据http://man7.org/linux/man-pages/man7/capabilities.7.html,将调度策略设置为实时策略需要CAP_SYS_NICE 能力。因此,pthread_attr_setschedpolicy 调用将失败,除非您具备该功能。

    要解决此问题,要么删除调度程序属性(并使用默认调度),要么确保您的进程以正确的功能启动(例如,以 root 身份启动并删除除CAP_SYS_NICE 之外的所有特权) .

    【讨论】:

    • 感谢您的回答。线程已启动并运行良好。我唯一担心的是警告。
    【解决方案2】:

    这个错误意味着,试图创建线程的进程没有适当的权限来设置指定的调度优先级。

    您是否可以忽略此警告很大程度上取决于程序及其在系统中的集成如何取决于为系统的相关程序/模块/组件设置的调度优先级。

    有关如何设置调度优先级的详细信息,您可以read this

    【讨论】: