Изменить приоритет собственного потока на Android в c/С++

Insanely неясный pthread api для приоритета потока не только необычайно непонятен, но и он просто не работает на android.

Итак, есть ли способ уменьшить или увеличить приоритет потока?

int currentPolicy;
struct sched_param sched;
status = pthread_getschedparam(pthread_self(), &currentPolicy, &sched);
printf("sched.sched_priority:%d currentPolicy:%d", sched.sched_priority, currentPolicy);
printf("priority min/max:%d/%d", sched_get_priority_min(currentPolicy), sched_get_priority_max(currentPolicy));

выходы:

sched.sched_priority: 0 currentPolicy: 0

приоритет мин/макс: 0/0

Кроме того, независимо от того, что я делаю, pthread_setschedparam всегда возвращает ошибку для меня (Invalid argument). В моем коде мне нужно уменьшить приоритет моего потока обработчика, чтобы убедиться, что другой поток использует больше времени процессора. Или, в качестве альтернативы, я мог бы увеличить приоритет потока моего другого потока, который я хочу использовать как больше процессора по сравнению с другими потоками в моем процессе.

Есть ли у меня способ сделать это? Я использую только собственный код С++.

Изменить: Из этого сообщения видно, что потоки андроида - это какие-то легкие процессы и для изменения приоритетов для них setpriority should использоваться. Похоже, что функция работает (getpriority до и после указывает, что приоритет был изменен). Однако я не вижу ожидаемого эффекта в своем приложении.

Ответ 1

Вот простой ответ: используйте int nice(int increment). Он объявлен в unistd.h

здесь код функции от Android:

int nice(int increment)
{
    int  priority = getpriority(PRIO_PROCESS, 0);
    return setpriority( PRIO_PROCESS, 0, priority+increment);
}

поэтому, setpriority может использоваться для установки приоритета потока.

Я действительно получил разницу, как ожидалось, в моем коде, используя nice(-10) или nice(10)

Ответ 2

Темы Android - это потоки Linux. Ничего особенного в них.

setpriority() изменяет значение "nice" потока, которое влияет на приоритет, на котором запланирован поток.

pthread_setschedparam() также можно использовать для изменения политики.

Вообще говоря, вы не можете повысить приоритет или изменить свою политику без повышенных привилегий (CAP_SYS_NICE). Вы можете опустить его или вернуть его к "нормальному" приоритету.

Если вы используете adb shell ps -t -p, вы можете видеть приоритеты, назначенные каждому потоку. Эта информация также включена в дампы хранилища Dalvik.

Dalvik использует setpriority() для временного повышения приоритета потока GC, если это необходимо (чтобы избежать инверсии приоритета). Если вы посмотрите на этот бит кода вокруг строки 625, вы можете это увидеть. Вы также можете вызвать вызов set_sched_policy(), функции библиотеки Android, которая изменяет cgroup поток.

Ответ 3

Невозможно установить приоритет потока POSIX в Android. Функции nice() и setpriority() настраивают приоритет процесса, а не одного потока.