安卓系统中 pthread_create 警告

4
在调用pthread_create函数后,我收到了以下消息:

W/libc (26409): pthread_create sched_setscheduler call failed: Operation not permitted

创建线程的代码如下:

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:代码在Nexus 4设备上作为本地活动运行,其OS版本为4.4.2(构建号为KOT49H)。
2个回答

7
当您调用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实时策略。将调度策略设置为实时策略需要CAP_SYS_NICE权限,根据http://man7.org/linux/man-pages/man7/capabilities.7.html。因此,除非您拥有该权限,否则pthread_attr_setschedpolicy调用将失败。
要解决问题,可以删除调度器属性(并使用默认调度),或确保进程以正确的权限启动(例如,以root身份启动并放弃除CAP_SYS_NICE之外的所有权限)。

谢谢回答。线程已经启动并运行良好。我唯一的担心是警告。 - Mircea Ispas
2023年更新: 现在如果你使用arm64-v8aABI编译Android应用,那么调用pthread_attr_setschedpolicy函数将会默默失败,然后pthread_create函数会失败但是errno==0(这本来是不可能的),并且实际上不会启动线程。所以基本上在Android上你完全不能调用pthread_attr_setschedpolicy()方法;你不能像以前一样忽略警告。我有NDK android-ndk-r25c版本,但是不知道这是从什么时候开始的。 - Louis Semprini

2
这个错误意味着,试图创建线程的进程没有适当的权限来设置指定的调度优先级。
无论你是否可以忽略此警告,强烈取决于程序及其集成在系统中对所涉及程序/模块/组件的调度优先级的依赖情况。
有关如何设置调度优先级的详细信息,您可能想要阅读这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接