.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk .\" .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH pthread_setschedparam 3 "20 июля 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ pthread_setschedparam, pthread_getschedparam \- изменяет/возвращает параметры и алгоритм планирования нити .SH LIBRARY POSIX threads library (\fIlibpthread\fP, \fI\-lpthread\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fBint pthread_setschedparam(pthread_t \fP\fIthread\fP\fB, int \fP\fIpolicy\fP\fB,\fP \fB const struct sched_param *\fP\fIparam\fP\fB);\fP \fBint pthread_getschedparam(pthread_t \fP\fIthread\fP\fB, int *restrict \fP\fIpolicy\fP\fB,\fP \fB struct sched_param *restrict \fP\fIparam\fP\fB);\fP .fi .SH ОПИСАНИЕ Функция \fBpthread_setschedparam\fP() назначает параметры и алгоритм планирования нити \fIthread\fP. .PP .\" FIXME . pthread_setschedparam() places no restriction on the policy, .\" but pthread_attr_setschedpolicy() restricts policy to RR/FIFO/OTHER .\" http://sourceware.org/bugzilla/show_bug.cgi?id=7013 В \fIpolicy\fP указывается новый алгоритм планирования \fIthread\fP. Поддерживаемые значения \fIpolicy\fP и их семантика описана в \fBsched\fP(7). .PP Структура, на которую указывает \fIparam\fP определяет новые параметры планирования \fIthread\fP. Параметры планирования хранятся в структуре следующего вида: .PP .in +4n .EX struct sched_param { int sched_priority; /* планируемый приоритет */ }; .EE .in .PP Из той структуры видно, что поддерживается только один параметр. Подробности о разрешённых диапазонах планируемых приоритетов для каждого алгоритма планирования смотрите в \fBsched\fP(7). .PP .\" FIXME . nptl/pthread_setschedparam.c has the following .\" /* If the thread should have higher priority because of some .\" PTHREAD_PRIO_PROTECT mutexes it holds, adjust the priority. */ .\" Eventually (perhaps after writing the mutexattr pages), we .\" may want to add something on the topic to this page. Функция \fBpthread_getschedparam\fP() возвращает параметры и алгоритм планирования нити \fIthread\fP в буфер, указанный \fIpolicy\fP и \fIparam\fP, соответственно. Возвращаемое значение приоритета совпадает с заданным с помощью последнего вызова \fBpthread_setschedparam\fP(), \fBpthread_setschedprio\fP(3) или \fBpthread_create\fP(3), относящегося к \fIthread\fP. Возвращаемые приоритет не отражает каких\-либо временных подстроек приоритета в результате вызовов функций наследования приоритета или потолка (например, смотрите \fBpthread_mutexattr_setprioceiling\fP(3) и \fBpthread_mutexattr_setprotocol\fP(3)). .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки. Если \fBpthread_setschedparam\fP() завершается ошибкой, то параметры и алгоритм планирования \fIthread\fP не изменяется. .SH ОШИБКИ Это функции могут завершиться со следующей ошибкой: .TP \fBESRCH\fP Нить с идентификатором \fIthread\fP не найдена. .PP Функция \fBpthread_setschedparam\fP() может также завершиться со следующими ошибками: .TP \fBEINVAL\fP Неизвестное значение \fIpolicy\fP или значение \fIparam\fP не имеет смысла для \fIpolicy\fP. .TP \fBEPERM\fP Вызывающий не имеет соответствующих прав для установки указанного алгоритма планирования и параметров. .PP Для \fBpthread_setschedparam\fP() в POSIX.1 также описана необязательная ошибка \fBENOTSUP\fP («попытка изменить параметры и алгоритм планирования на не поддерживаемое значение»). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBpthread_setschedparam\fP(), \fBpthread_getschedparam\fP() T} Безвредность в нитях MT\-Safe .TE .sp 1 .SH СТАНДАРТЫ POSIX.1\-2008. .SH ИСТОРИЯ glibc 2.0 POSIX.1\-2001. .SH ЗАМЕЧАНИЯ Список требуемых прав, результат, изменение алгоритма и приоритета планирования нити и подробности разрешённых диапазонов приоритетов для каждого алгоритма планирования смотрите в \fBsched\fP(7). .SH ПРИМЕРЫ Представленная ниже программа показывает использование \fBpthread_setschedparam\fP() и \fBpthread_getschedparam\fP(), а также других относящихся к планированию функций программного интерфейса pthreads. .PP В этом сеансе, главная нить изменяет свой алгоритм планирования на \fBSCHED_FIFO\fP с приоритетом 10, и инициализирует объект атрибутов нити с атрибутом алгоритма планирования \fBSCHED_RR\fP и атрибутом приоритета планирования 20. Затем программа изменяет (с помощью \fBpthread_attr_setinheritsched\fP(3)) атрибут наследования планировщика в объекте атрибутов нити на \fBPTHREAD_EXPLICIT_SCHED\fP, из\-за чего создаваемые с использованием данного объекта атрибутов нити получат значения атрибуты планирования из объекта атрибутов нити. Затем программа создаёт нить с учётом объекта атрибутов нити, после чего эта нить выводит значения своего алгоритма и приоритета планирования. .PP .in +4n .EX $ \fBsu\fP # Need privilege to set real\-time scheduling policies Password: # \fB./a.out \-mf10 \-ar20 \-i e\fP Scheduler settings of main thread policy=SCHED_FIFO, priority=10 \& Scheduler settings in \[aq]attr\[aq] policy=SCHED_RR, priority=20 inheritsched is EXPLICIT \& Scheduler attributes of new thread policy=SCHED_RR, priority=20 .EE .in .PP В показанном выше выводе можно видеть приоритет и алгоритм планирования, которые были взяты из объекта атрибутов нити. .PP Следующий сеанс похож на предыдущий, то в нём атрибут наследования планировщика равен \fBPTHREAD_INHERIT_SCHED\fP, то есть создаваемые с использованием объекта атрибутов нити игнорируют значения параметров и алгоритм планирования, заданные в объекте атрибутов нити, и берут их от создавшей нити. .PP .in +4n .EX # \fB./a.out \-mf10 \-ar20 \-i i\fP Scheduler settings of main thread policy=SCHED_FIFO, priority=10 \& Scheduler settings in \[aq]attr\[aq] policy=SCHED_RR, priority=20 inheritsched is INHERIT \& Scheduler attributes of new thread policy=SCHED_FIFO, priority=10 .EE .in .PP В показанном выше выводе можно видеть приоритет и алгоритм планирования, которые были взяты из создаваемой нити, а не из объекта атрибутов нити. .PP Note that if we had omitted the \fI\-i\~i\fP option, the output would have been the same, since \fBPTHREAD_INHERIT_SCHED\fP is the default for the inherit scheduler attribute. .SS "Исходный код программы" .\" SRC BEGIN (pthreads_sched_test.c) \& .EX /* pthreads_sched_test.c */ \& #include #include #include #include #include \& #define handle_error_en(en, msg) \e do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) \& static void usage(char *prog_name, char *msg) { if (msg != NULL) fputs(msg, stderr); \& fprintf(stderr, "Usage: %s [options]\en", prog_name); fprintf(stderr, "Options are:\en"); #define fpe(msg) fprintf(stderr, "\et%s", msg) /* Shorter */ fpe("\-a Set scheduling policy and priority in\en"); fpe(" thread attributes object\en"); fpe(" can be\en"); fpe(" f SCHED_FIFO\en"); fpe(" r SCHED_RR\en"); fpe(" o SCHED_OTHER\en"); fpe("\-A Use default thread attributes object\en"); fpe("\-i {e|i} Set inherit scheduler attribute to\en"); fpe(" \[aq]explicit\[aq] or \[aq]inherit\[aq]\en"); fpe("\-m Set scheduling policy and priority on\en"); fpe(" main thread before pthread_create() call\en"); exit(EXIT_FAILURE); } \& static int get_policy(char p, int *policy) { switch (p) { case \[aq]f\[aq]: *policy = SCHED_FIFO; return 1; case \[aq]r\[aq]: *policy = SCHED_RR; return 1; case \[aq]o\[aq]: *policy = SCHED_OTHER; return 1; default: return 0; } } \& static void display_sched_attr(int policy, struct sched_param *param) { printf(" policy=%s, priority=%d\en", (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, ¶m); if (s != 0) handle_error_en(s, "pthread_getschedparam"); \& printf("%s\en", msg); display_sched_attr(policy, ¶m); } \& 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 \[aq]a\[aq]: attr_sched_str = optarg; break; case \[aq]A\[aq]: use_null_attrib = 1; break; case \[aq]i\[aq]: inheritsched_str = optarg; break; case \[aq]m\[aq]: main_sched_str = optarg; break; default: usage(argv[0], "Unrecognized option\en"); } } \& if (use_null_attrib && (inheritsched_str != NULL || attr_sched_str != NULL)) { usage(argv[0], "Can\[aq]t specify \-A with \-i or \-a\en"); } \& /* 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)\en"); param.sched_priority = strtol(&main_sched_str[1], NULL, 0); \& s = pthread_setschedparam(pthread_self(), policy, ¶m); if (s != 0) handle_error_en(s, "pthread_setschedparam"); } \& display_thread_sched_attr("Scheduler settings of main thread"); printf("\en"); \& /* 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] == \[aq]e\[aq]) inheritsched = PTHREAD_EXPLICIT_SCHED; else if (inheritsched_str[0] == \[aq]i\[aq]) inheritsched = PTHREAD_INHERIT_SCHED; else usage(argv[0], "Value for \-i must be \[aq]e\[aq] or \[aq]i\[aq]\en"); \& 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 \[aq]attr\[aq] (\-a)\en"); 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, ¶m); 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, ¶m); 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 \[aq]attr\[aq]\en"); display_sched_attr(policy, ¶m); \& pthread_attr_getinheritsched(&attr, &inheritsched); printf(" inheritsched is %s\en", (inheritsched == PTHREAD_INHERIT_SCHED) ? "INHERIT" : (inheritsched == PTHREAD_EXPLICIT_SCHED) ? "EXPLICIT" : "???"); printf("\en"); } \& /* 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); } .EE .\" SRC END .SH "СМ. ТАКЖЕ" .ad l .nh \fBgetrlimit\fP(2), \fBsched_get_priority_min\fP(2), \fBpthread_attr_init\fP(3), \fBpthread_attr_setinheritsched\fP(3), \fBpthread_attr_setschedparam\fP(3), \fBpthread_attr_setschedpolicy\fP(3), \fBpthread_create\fP(3), \fBpthread_self\fP(3), \fBpthread_setschedprio\fP(3), \fBpthreads\fP(7), \fBsched\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .