Подтвердить что ты не робот

Хороший уровень для pthreads?

На встроенной системе (ядро Linux 2.6.28 на процессоре ARM с использованием glibc 2.6.1) Я запускаю приложение, состоящее из нескольких потоков. Я бы хотел, чтобы один из этих потоков получил больше времени процессора, чем другие.

Один из вариантов установки приоритетов - использовать pthread\_setschedparam с помощью SCHED\_RR (или SCHED\_FIFO), однако это дает потоку слишком много CPU (если только он спит, он съедает весь процессор из своих сопутствующих потоков, которые все еще используют SCHED_OTHER).

Другой вариант - установить хороший уровень потока. Однако, хотя это было именно то, что я искал (поток просто получает немного больше процессора, но не может голодать на другие потоки), я не могу заставить его работать правильно. Согласно man-страницам "потоки не имеют общего полезного значения", которые я интерпретирую как то, что я могу установить отдельные хорошие значения для разных потоков в одном и том же процессе.

Здесь мой код:

pid_t tid;
tid = syscall(SYS_gettid);

int ret = setpriority(PRIO_PROCESS, tid, priority);

Однако кажется, что tid одинаково среди всех потоков. Кроме того, установка отдельных уровней nice для потока будет по-прежнему возвращать последний набор приятного уровня во всех потоках при вызове getpriority. Из производительности это согласовано (т.е. Запустите поток A и поток B с одной и той же задачей, затем установите A в -19 и B в 19, и оба будут заканчиваться примерно в одно и то же время).

Тем не менее, при запуске потока A, затем установите его на -19, а затем запустив B и установив его на +19, B будет работать на полную мощность (заканчивая путь впереди A).

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

Я искал Google как сумасшедший для получения дополнительной информации или любого подтверждения, но все, что я нашел до сих пор, довольно расплывчато. Есть ли у кого-нибудь описание какого-либо описания того, как справляются с хорошими уровнями потоков в Linux (2.6.28, glibc 2.6.1)? И как я мог бы изменить хороший уровень уже запущенного потока?

4b9b3361

Ответ 1

Errm, как только я разместил этот вопрос, я внезапно осознал свою ошибку - я установил хороший уровень, вызвав функцию из основного потока, так что, конечно, все они имеют одинаковый идентификатор потока (поскольку он выполняется в контексте основной поток). DOH!!!!

Использование правильного tid все отлично работает.

Теперь, как удалить этот вопрос?