android上的pthread_create警告

在调用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 OS版本(内部版本号KOT49H)的Nexus 4设备上作为本机活动运行。

当您使用调度策略属性创建线程时,您要求设置特定的schedulinc策略( http://man7.org/linux/man-pages/man3/pthread_attr_getschedpolicy.3.html )。 根据http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html ,您正在设置的策略SCHED_FIFO是一个实时策略。 根据http://man7.org/linux/man-pages/man7/capabilities.7.html,将调度策略设置为实时策略需要CAP_SYS_NICEfunction。 因此,除非您具有该function,否则pthread_create调用将失败。

要解决此问题,请删除调度程序属性(并使用默认调度),或者确保使用正确的function启动进程(例如,以root身份启动并删除除CAP_SYS_NICE之外的所有权限)。

此错误意味着尝试创建线程的进程没有适当的权限来设置指定的调度priorty。

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

有关如何设置调度优先级的详细信息,您可能希望阅读此内容 。