Запуск потока с очень низким приоритетом - PullRequest
0 голосов
/ 18 сентября 2018

Я создал поток в моем приложении Linux, используя pthread_create ().Я хотел бы позволить этому потоку работать с очень очень низким приоритетом, поскольку в одном приложении выполняются некоторые потоки реального времени.Ниже приведен код, который у меня есть в самой функции потока:

        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
        pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

        /* Trying to set lowest priority possible for this thread */
        param.sched_priority = 0;
        ret = pthread_setschedparam(pthread_self(), SCHED_IDLE, &param);
        if (!ret)
                printf("Successfully set sched policy of thread\n");

Я хочу подтвердить, является ли приведенный выше код в порядке или нет.Гарантирует ли это, что моему потоку не будет предоставлен более высокий приоритет по сравнению с другими потоками реального времени.Пожалуйста, предложите, если какие-либо изменения необходимы.К вашему сведению, код работает на встроенной платформе.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Со страницы руководства pthread_create

int pthread_create (pthread_t * thread, const pthread_attr_t * attr , void * (* start_routine) (void *), void * arg);

вы можете создать свой собственный атрибут и установить его свойства, включая priority , как вы это сделали.

param.sched_priority = 0;

И со страницы руководства pthread_setschedparam

int pthread_setschedparam (поток pthread_t, политика int, структура const sched_param * param);

pthread_getschedparam() и pthread_setschedparam() позволяют извлекать политику планирования и параметры планирования отдельных потоков в многопоточном процессе и устанавливать ,Для SCHED_FIFO и SCHED_RR единственным обязательным элементом структуры sched_param является приоритет sched_priority .Для SCHED_OTHER затронутые параметры планирования зависят от реализации .

Если функция pthread_setschedparam() завершится неудачно, никакие параметры планирования не будут изменены для целевого потока.

Таким образом, выше четко указано, что вы можете установить и получить параметры планирования для политики планирования RR и FIFO.Также в случае SCHED_OTHER это зависит от реализации.

После запуска потока, который меняет приоритет, выполните команду и проверьте.Например, выполните приведенную ниже команду

ps -T -l [PID]

и отметьте priority относительно PID.

Также прочитайте @paxdiablo ответ здесь о планировании потоков в Linuxприоритеты.

0 голосов
/ 18 сентября 2018

Полагаю, вы использовали расписание совместного использования времени по умолчанию в Linux.как вы добавили param.sched_priority = 0;

для этого, вы можете проверить Здесь

, который утверждает, что

   SCHED_OTHER can be used at only static priority 0 (i.e., threads
   under real-time policies always have priority over SCHED_OTHER pro‐
   cesses).  SCHED_OTHER is the standard Linux time-sharing scheduler
   that is intended for all threads that do not require the special
   real-time mechanisms.
   The thread to run is chosen from the static priority 0 list based on
   a dynamic priority that is determined only inside this list.  The
   dynamic priority is based on the nice value (see below) and is
   increased for each time quantum the thread is ready to run, but
   denied to run by the scheduler.  This ensures fair progress among all
   SCHED_OTHER threads.
...