调用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);
请注意,在运行回调中的断点被命中之前,该消息会出现在logcat中。
你知道为什么我会有这个警告吗?忽视它安全吗-如果是为什么?
ps:代码在4.4.2OS版本(内部版本号kot49h)的Nexus4设备上作为本机活动运行。
最佳答案
创建具有调度策略属性的线程时,请求设置特定的调度策略(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_nice功能。因此,pthread_create调用将失败,除非您具有该功能。
要解决此问题,请删除scheduler属性(并使用默认计划),或者确保您的进程以正确的功能启动(例如,将其作为根启动并删除除cap_sys_nice之外的所有权限)。