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);

Обратите внимание, что сообщение появляется в logcat до достижения точки останова в RunCallback.

Вы знаете, почему у меня есть это предупреждение? Безопасно ли игнорировать это - если да, то почему?

PS: код работает как штатная активность на устройствах Nexus 4 с версией ОС 4.4.2 (номер сборки KOT49H).

2 ответа

Решение

Когда вы создаете поток с атрибутом политики планирования, вы запрашиваете, чтобы была установлена ​​конкретная политика schedulinc ( http://man7.org/linux/man-pages/man3/pthread_attr_getschedpolicy.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_create завершится ошибкой, если у вас нет такой возможности.

Чтобы решить эту проблему, либо удалите атрибут планировщика (и используйте расписание по умолчанию), либо убедитесь, что ваш процесс запущен с правильными возможностями (например, запустив его как root и отбросив все привилегии, кроме CAP_SYS_NICE).

Эта ошибка означает, что процесс, пытающийся создать поток, не имеет соответствующих привилегий для установки приоритетов планирования, как указано.

Возможность игнорирования этого предупреждения сильно зависит от того, как программа и ее интеграция в систему зависят от приоритетов планирования, установленных для задействованных программ / модулей / компонентов системы.

Для получения подробной информации о том, как установить приоритеты планирования, вы можете прочитать это.

Другие вопросы по тегам