Установка приоритета потока в Linux с Повышением

Можно добавить банки к $HOME/.groovy/lib

25
задан Newton Falls 8 March 2014 в 16:25
поделиться

2 ответа

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

проблема в том, что boost :: thread не имеет конструктора, который позволяет передавать атрибуты pthead при создании потока, поэтому вам нужно вносить изменения после запуска потока. Единственный известный мне способ обойти это ограничение - это наследование расписания процесса / потока. Если не указано иное, новые потоки унаследуют расписание / приоритет своего создателя, поэтому вы можете изменить текущий поток перед созданием рабочих потоков, а затем изменить обратно, если хотите. Выглядит неудобно, но это альтернатива.

Вот взлом примера, который, надеюсь, демонстрирует оба. Возможно, вам придется изменить политику и приоритет соответствующим образом и запустить его от имени пользователя root.

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

#include <iostream>
#include <boost/thread/thread.hpp>
#include <unistd.h>
#include <sched.h>
#include <cstdio>


void* threadfunc()
{
    sleep(5);
}

void displayAndChange(boost::thread& daThread)
{
    int retcode;
    int policy;

    pthread_t threadID = (pthread_t) daThread.native_handle();

    struct sched_param param;

    if ((retcode = pthread_getschedparam(threadID, &policy, &param)) != 0)
    {
        errno = retcode;
        perror("pthread_getschedparam");
        exit(EXIT_FAILURE);
    }

    std::cout << "INHERITED: ";
    std::cout << "policy=" << ((policy == SCHED_FIFO)  ? "SCHED_FIFO" :
                               (policy == SCHED_RR)    ? "SCHED_RR" :
                               (policy == SCHED_OTHER) ? "SCHED_OTHER" :
                                                         "???")
              << ", priority=" << param.sched_priority << std::endl;


    policy = SCHED_FIFO;
    param.sched_priority = 4;

    if ((retcode = pthread_setschedparam(threadID, policy, &param)) != 0)
    {
        errno = retcode;
        perror("pthread_setschedparam");
        exit(EXIT_FAILURE);
    }

    std::cout << "  CHANGED: ";
    std::cout << "policy=" << ((policy == SCHED_FIFO)  ? "SCHED_FIFO" :
                               (policy == SCHED_RR)    ? "SCHED_RR" :
                               (policy == SCHED_OTHER) ? "SCHED_OTHER" :
                                                          "???")
              << ", priority=" << param.sched_priority << std::endl;
}


int main(int argc, char* argv[])
{
    int policy, res;

    struct sched_param param;

    if ((policy = sched_getscheduler(getpid())) == -1)
    {
        perror("sched_getscheduler");
        exit(EXIT_FAILURE);
    }

    if ((res = sched_getparam(getpid(), &param)) == -1)
    {
        perror("sched_getparam");
        exit(EXIT_FAILURE);
    }

    std::cout << " ORIGINAL: ";
    std::cout << "policy=" << ((policy == SCHED_FIFO)  ? "SCHED_FIFO" :
                               (policy == SCHED_RR)    ? "SCHED_RR" :
                               (policy == SCHED_OTHER) ? "SCHED_OTHER" :
                                                          "???")
              << ", priority=" << param.sched_priority << std::endl;


    policy = SCHED_RR;
    param.sched_priority = 2;

    if ((res = sched_setscheduler(getpid(), policy, &param)) == -1)
    {
        perror("sched_setscheduler");
        exit(EXIT_FAILURE);
    }

    boost::thread t1(&threadfunc);

    displayAndChange(t1);

    t1.join();

    return 0;
}
24
ответ дан 28 November 2019 в 21:41
поделиться

Я не думаю, что Linux действительно имеет приоритеты потоков - в большинстве ядер вы можете использовать «Хорошие» уровни, но это, вероятно, все (что упростило бы scheduler) - однако не все Linux-системы будут это учитывать! (Зависит от планировщика).

1
ответ дан 28 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: