pthread_setschedparam(3) Library Functions Manual pthread_setschedparam(3)

ИМЯ

pthread_setschedparam, pthread_getschedparam - изменяет/возвращает параметры и алгоритм планирования нити

POSIX threads library (libpthread, -lpthread)

СИНТАКСИС

#include <pthread.h>
int pthread_setschedparam(pthread_t thread, int policy,
                          const struct sched_param *param);
int pthread_getschedparam(pthread_t thread, int *restrict policy,
                          struct sched_param *restrict param);

ОПИСАНИЕ

Функция pthread_setschedparam() назначает параметры и алгоритм планирования нити thread.

В policy указывается новый алгоритм планирования thread. Поддерживаемые значения policy и их семантика описана в sched(7).

Структура, на которую указывает param определяет новые параметры планирования thread. Параметры планирования хранятся в структуре следующего вида:


struct sched_param {
    int sched_priority;     /* планируемый приоритет */
};

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

Функция pthread_getschedparam() возвращает параметры и алгоритм планирования нити thread в буфер, указанный policy и param, соответственно. Возвращаемое значение приоритета совпадает с заданным с помощью последнего вызова pthread_setschedparam(), pthread_setschedprio(3) или pthread_create(3), относящегося к thread. Возвращаемые приоритет не отражает каких-либо временных подстроек приоритета в результате вызовов функций наследования приоритета или потолка (например, смотрите pthread_mutexattr_setprioceiling(3) и pthread_mutexattr_setprotocol(3)).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки. Если pthread_setschedparam() завершается ошибкой, то параметры и алгоритм планирования thread не изменяется.

ОШИБКИ

Это функции могут завершиться со следующей ошибкой:

Нить с идентификатором thread не найдена.

Функция pthread_setschedparam() может также завершиться со следующими ошибками:

Неизвестное значение policy или значение param не имеет смысла для policy.
Вызывающий не имеет соответствующих прав для установки указанного алгоритма планирования и параметров.

Для pthread_setschedparam() в POSIX.1 также описана необязательная ошибка ENOTSUP («попытка изменить параметры и алгоритм планирования на не поддерживаемое значение»).

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
pthread_setschedparam(), pthread_getschedparam() Безвредность в нитях MT-Safe

СТАНДАРТЫ

POSIX.1-2008.

ИСТОРИЯ

glibc 2.0 POSIX.1-2001.

ПРИМЕЧАНИЯ

Список требуемых прав, результат, изменение алгоритма и приоритета планирования нити и подробности разрешённых диапазонов приоритетов для каждого алгоритма планирования смотрите в sched(7).

ПРИМЕРЫ

Представленная ниже программа показывает использование pthread_setschedparam() и pthread_getschedparam(), а также других относящихся к планированию функций программного интерфейса pthreads.

В этом сеансе, главная нить изменяет свой алгоритм планирования на SCHED_FIFO с приоритетом 10, и инициализирует объект атрибутов нити с атрибутом алгоритма планирования SCHED_RR и атрибутом приоритета планирования 20. Затем программа изменяет (с помощью pthread_attr_setinheritsched(3)) атрибут наследования планировщика в объекте атрибутов нити на PTHREAD_EXPLICIT_SCHED, из-за чего создаваемые с использованием данного объекта атрибутов нити получат значения атрибуты планирования из объекта атрибутов нити. Затем программа создаёт нить с учётом объекта атрибутов нити, после чего эта нить выводит значения своего алгоритма и приоритета планирования.


$ su      # Need privilege to set real-time scheduling policies
Password:
# ./a.out -mf10 -ar20 -i e
Scheduler settings of main thread
    policy=SCHED_FIFO, priority=10
Scheduler settings in 'attr'
    policy=SCHED_RR, priority=20
    inheritsched is EXPLICIT
Scheduler attributes of new thread
    policy=SCHED_RR, priority=20

В показанном выше выводе можно видеть приоритет и алгоритм планирования, которые были взяты из объекта атрибутов нити.

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


# ./a.out -mf10 -ar20 -i i
Scheduler settings of main thread
    policy=SCHED_FIFO, priority=10
Scheduler settings in 'attr'
    policy=SCHED_RR, priority=20
    inheritsched is INHERIT
Scheduler attributes of new thread
    policy=SCHED_FIFO, priority=10

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

Note that if we had omitted the -i i option, the output would have been the same, since PTHREAD_INHERIT_SCHED is the default for the inherit scheduler attribute.

Исходный код программы

/* pthreads_sched_test.c */
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define handle_error_en(en, msg) \
        do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
[[noreturn]]
static void
usage(char *prog_name, char *msg)
{
    if (msg != NULL)
        fputs(msg, stderr);
    fprintf(stderr, "Usage: %s [options]\n", prog_name);
    fprintf(stderr, "Options are:\n");
#define fpe(msg) fprintf(stderr, "\t%s", msg)          /* Shorter */
    fpe("-a<policy><prio> Set scheduling policy and priority in\n");
    fpe("                 thread attributes object\n");
    fpe("                 <policy> can be\n");
    fpe("                     f  SCHED_FIFO\n");
    fpe("                     r  SCHED_RR\n");
    fpe("                     o  SCHED_OTHER\n");
    fpe("-A               Use default thread attributes object\n");
    fpe("-i {e|i}         Set inherit scheduler attribute to\n");
    fpe("                 'explicit' or 'inherit'\n");
    fpe("-m<policy><prio> Set scheduling policy and priority on\n");
    fpe("                 main thread before pthread_create() call\n");
    exit(EXIT_FAILURE);
}
static int
get_policy(char p, int *policy)
{
    switch (p) {
    case 'f': *policy = SCHED_FIFO;     return 1;
    case 'r': *policy = SCHED_RR;       return 1;
    case 'o': *policy = SCHED_OTHER;    return 1;
    default:  return 0;
    }
}
static void
display_sched_attr(int policy, const struct sched_param *param)
{
    printf("    policy=%s, priority=%d\n",
           (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
           (policy == SCHED_RR)    ? "SCHED_RR" :
           (policy == SCHED_OTHER) ? "SCHED_OTHER" :
           "???",
           param->sched_priority);
}
static void
display_thread_sched_attr(char *msg)
{
    int policy, s;
    struct sched_param param;
    s = pthread_getschedparam(pthread_self(), &policy, &param);
    if (s != 0)
        handle_error_en(s, "pthread_getschedparam");
    printf("%s\n", msg);
    display_sched_attr(policy, &param);
}
static void *
thread_start(void *arg)
{
    display_thread_sched_attr("Scheduler attributes of new thread");
    return NULL;
}
int
main(int argc, char *argv[])
{
    int s, opt, inheritsched, use_null_attrib, policy;
    pthread_t thread;
    pthread_attr_t attr;
    pthread_attr_t *attrp;
    char *attr_sched_str, *main_sched_str, *inheritsched_str;
    struct sched_param param;
    /* Process command-line options. */
    use_null_attrib = 0;
    attr_sched_str = NULL;
    main_sched_str = NULL;
    inheritsched_str = NULL;
    while ((opt = getopt(argc, argv, "a:Ai:m:")) != -1) {
        switch (opt) {
        case 'a': attr_sched_str = optarg;      break;
        case 'A': use_null_attrib = 1;          break;
        case 'i': inheritsched_str = optarg;    break;
        case 'm': main_sched_str = optarg;      break;
        default:  usage(argv[0], "Unrecognized option\n");
        }
    }
    if (use_null_attrib
        && (inheritsched_str != NULL || attr_sched_str != NULL))
    {
        usage(argv[0], "Can't specify -A with -i or -a\n");
    }
    /* Optionally set scheduling attributes of main thread,
       and display the attributes. */
    if (main_sched_str != NULL) {
        if (!get_policy(main_sched_str[0], &policy))
            usage(argv[0], "Bad policy for main thread (-m)\n");
        param.sched_priority = strtol(&main_sched_str[1], NULL, 0);
        s = pthread_setschedparam(pthread_self(), policy, &param);
        if (s != 0)
            handle_error_en(s, "pthread_setschedparam");
    }
    display_thread_sched_attr("Scheduler settings of main thread");
    printf("\n");
    /* Initialize thread attributes object according to options. */
    attrp = NULL;
    if (!use_null_attrib) {
        s = pthread_attr_init(&attr);
        if (s != 0)
            handle_error_en(s, "pthread_attr_init");
        attrp = &attr;
    }
    if (inheritsched_str != NULL) {
        if (inheritsched_str[0] == 'e')
            inheritsched = PTHREAD_EXPLICIT_SCHED;
        else if (inheritsched_str[0] == 'i')
            inheritsched = PTHREAD_INHERIT_SCHED;
        else
            usage(argv[0], "Value for -i must be 'e' or 'i'\n");
        s = pthread_attr_setinheritsched(&attr, inheritsched);
        if (s != 0)
            handle_error_en(s, "pthread_attr_setinheritsched");
    }
    if (attr_sched_str != NULL) {
        if (!get_policy(attr_sched_str[0], &policy))
            usage(argv[0], "Bad policy for 'attr' (-a)\n");
        param.sched_priority = strtol(&attr_sched_str[1], NULL, 0);
        s = pthread_attr_setschedpolicy(&attr, policy);
        if (s != 0)
            handle_error_en(s, "pthread_attr_setschedpolicy");
        s = pthread_attr_setschedparam(&attr, &param);
        if (s != 0)
            handle_error_en(s, "pthread_attr_setschedparam");
    }
    /* If we initialized a thread attributes object, display
       the scheduling attributes that were set in the object. */
    if (attrp != NULL) {
        s = pthread_attr_getschedparam(&attr, &param);
        if (s != 0)
            handle_error_en(s, "pthread_attr_getschedparam");
        s = pthread_attr_getschedpolicy(&attr, &policy);
        if (s != 0)
            handle_error_en(s, "pthread_attr_getschedpolicy");
        printf("Scheduler settings in 'attr'\n");
        display_sched_attr(policy, &param);
        pthread_attr_getinheritsched(&attr, &inheritsched);
        printf("    inheritsched is %s\n",
               (inheritsched == PTHREAD_INHERIT_SCHED)  ? "INHERIT" :
               (inheritsched == PTHREAD_EXPLICIT_SCHED) ? "EXPLICIT" :
               "???");
        printf("\n");
    }
    /* Create a thread that will display its scheduling attributes. */
    s = pthread_create(&thread, attrp, &thread_start, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_create");
    /* Destroy unneeded thread attributes object. */
    if (!use_null_attrib) {
      s = pthread_attr_destroy(&attr);
      if (s != 0)
          handle_error_en(s, "pthread_attr_destroy");
    }
    s = pthread_join(thread, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_join");
    exit(EXIT_SUCCESS);
}

СМОТРИТЕ ТАКЖЕ

getrlimit(2), sched_get_priority_min(2), pthread_attr_init(3), pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_create(3), pthread_self(3), pthread_setschedprio(3), pthreads(7), sched(7)

ПЕРЕВОД

Русский перевод этой страницы руководства разработал Alexey, Azamat Hackimov <azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Darima Kogan <silverdk99@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.

2 мая 2024 г. Linux man-pages 6.8