pthread_setschedparam

PTHREAD_SETSCHEDÐAÑководÑÑво пÑогÑаммиÑÑPTHREADxSETSCHEDPARAM(3)



ÐÐЯ
       pthread_setschedparam, pthread_getschedparam -
       изменÑеÑ/возвÑаÑÐ°ÐµÑ Ð¿Ð°ÑамеÑÑÑ Ð¸ алгоÑиÑм
       планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¸Ñи

ÐÐÐÐÐ
       #include <pthread.h>

       int pthread_setschedparam(pthread_t thread, int policy,
                                 const struct sched_param *param);
       int pthread_getschedparam(pthread_t thread, int *policy,
                                 struct sched_param *param);

       ÐомпилиÑÑеÑÑÑ Ð¸ компонÑеÑÑÑ Ð²Ð¼ÐµÑÑе Ñ -pthread.

ÐÐÐСÐÐÐÐ
       ФÑнкÑÐ¸Ñ 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 не изменÑеÑÑÑ.

ÐШÐÐÐÐ
       ÐÑо ÑÑнкÑии могÑÑ Ð·Ð°Ð²ÐµÑÑиÑÑÑÑ Ñо ÑледÑÑÑей
       оÑибкой:

       ESRCH  ÐиÑÑ Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом thread не найдена.

       ФÑнкÑÐ¸Ñ pthread_setschedparam() Ð¼Ð¾Ð¶ÐµÑ Ñакже
       завеÑÑиÑÑÑÑ Ñо ÑледÑÑÑими оÑибками:

       EINVAL ÐеизвеÑÑное знаÑение policy или
              знаÑение param не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла Ð´Ð»Ñ policy.

       EPERM  ÐÑзÑваÑÑий не Ð¸Ð¼ÐµÐµÑ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð¿Ñав
              Ð´Ð»Ñ ÑÑÑановки Ñказанного алгоÑиÑма
              планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ паÑамеÑÑов.

       ÐÐ»Ñ pthread_setschedparam() в POSIX.1 Ñакже опиÑана
       необÑзаÑелÑÐ½Ð°Ñ Ð¾Ñибка ENOTSUP («попÑÑка
       измениÑÑ Ð¿Ð°ÑамеÑÑÑ Ð¸ алгоÑиÑм планиÑованиÑ
       на не поддеÑживаемое знаÑение»).

ÐТРÐÐУТЫ
       ÐпиÑание ÑеÑминов данного Ñаздела ÑмоÑÑиÑе
       в attributes(7).

       ┌─────────────────────────┬────────────────────────────────┬────────────────┐
       │ÐнÑеÑÑÐµÐ¹Ñ            ÐÑÑибÑÑ                      ÐнаÑение │
       ├─────────────────────────┼────────────────────────────────┼────────────────┤
       │pthread_setschedparam(), │ ÐезвÑедноÑÑÑ Ð² ниÑÑÑ │ MT-Safe        │
       │pthread_getschedparam()  │                                │                │
       └─────────────────────────┴────────────────────────────────┴────────────────┘
СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       POSIX.1-2001, POSIX.1-2008.

ÐÐÐÐЧÐÐÐЯ
       СпиÑок ÑÑебÑемÑÑ Ð¿Ñав, ÑезÑлÑÑаÑ, изменение
       алгоÑиÑма и пÑиоÑиÑеÑа планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¸Ñи и
       подÑобноÑÑи ÑазÑеÑÑннÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð²
       пÑиоÑиÑеÑов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ алгоÑиÑма
       планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑмоÑÑиÑе в sched(7).

ÐÐ ÐÐÐÐ
       ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ пÑогÑамма показÑваеÑ
       иÑполÑзование pthread_setschedparam() и
       pthread_getschedparam(), а Ñакже дÑÑÐ³Ð¸Ñ Ð¾ÑноÑÑÑиÑÑÑ Ðº
       планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑий пÑогÑаммного
       инÑеÑÑейÑа pthreads.

       Ð ÑÑом ÑеанÑе, Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ð½Ð¸ÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÐµÑ Ñвой
       алгоÑиÑм планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° SCHED_FIFO Ñ
       пÑиоÑиÑеÑом 10, и иниÑиализиÑÑÐµÑ Ð¾Ð±ÑекÑ
       аÑÑибÑÑов ниÑи Ñ Ð°ÑÑибÑÑом алгоÑиÑма
       планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ SCHED_RR и аÑÑибÑÑом пÑиоÑиÑеÑа
       планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ 20. ÐаÑем пÑогÑамма изменÑÐµÑ (Ñ
       помоÑÑÑ pthread_attr_setinheritsched(3)) аÑÑибÑÑ
       наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика в обÑекÑе
       аÑÑибÑÑов ниÑи на PTHREAD_EXPLICIT_SCHED, из-за Ñего
       ÑоздаваемÑе Ñ Ð¸ÑполÑзованием данного
       обÑекÑа аÑÑибÑÑов ниÑи полÑÑÐ°Ñ Ð·Ð½Ð°ÑениÑ
       аÑÑибÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· обÑекÑа аÑÑибÑÑов
       ниÑи. ÐаÑем пÑогÑамма ÑоздаÑÑ Ð½Ð¸ÑÑ Ñ ÑÑÑÑом
       обÑекÑа аÑÑибÑÑов ниÑи, поÑле Ñего ÑÑа ниÑÑ
       вÑÐ²Ð¾Ð´Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñвоего алгоÑиÑма и
       пÑиоÑиÑеÑа планиÑованиÑ.

           $ su      # ÑÑебÑÑÑÑÑ Ð¿Ñава Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð°Ð»Ð³Ð¾ÑиÑмов
                       планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеалÑного вÑемени
           ÐаÑолÑ:
           # ./a.out -mf10 -ar20 -i e
           ÐаÑÑÑойки планиÑовÑика главной ниÑи
               алгоÑиÑм=SCHED_FIFO, пÑиоÑиÑеÑ=10

           ÐаÑÑÑойки планиÑовÑика в 'attr'
               алгоÑиÑм=SCHED_RR, пÑиоÑиÑеÑ=20
               наÑледование планиÑовÑика ЯÐÐÐÐ

           ÐÑÑибÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика в новой ниÑи
               алгоÑиÑм=SCHED_RR, пÑиоÑиÑеÑ=20

       Рпоказанном вÑÑе вÑводе можно видеÑÑ
       пÑиоÑиÑÐµÑ Ð¸ алгоÑиÑм планиÑованиÑ, коÑоÑÑе
       бÑли взÑÑÑ Ð¸Ð· обÑекÑа аÑÑибÑÑов ниÑи.

       СледÑÑÑий ÑÐµÐ°Ð½Ñ Ð¿Ð¾Ñож на пÑедÑдÑÑий, Ñо в нÑм
       аÑÑибÑÑ Ð½Ð°ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика Ñавен
       PTHREAD_INHERIT_SCHED, Ñо еÑÑÑ ÑоздаваемÑе Ñ
       иÑполÑзованием обÑекÑа аÑÑибÑÑов ниÑи
       игноÑиÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов и алгоÑиÑм
       планиÑованиÑ, заданнÑе в обÑекÑе аÑÑибÑÑов
       ниÑи, и беÑÑÑ Ð¸Ñ Ð¾Ñ ÑоздавÑей ниÑи.

           # ./a.out -mf10 -ar20 -i i
           ÐаÑÑÑойки планиÑовÑика главной ниÑи
               алгоÑиÑм=SCHED_FIFO, пÑиоÑиÑеÑ=10

           ÐаÑÑÑойки планиÑовÑика в 'attr'
               алгоÑиÑм=SCHED_RR, пÑиоÑиÑеÑ=20
               наÑледование планиÑовÑика ÐÐÐЮЧÐÐÐ

           ÐÑÑибÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика в новой ниÑи
               алгоÑиÑм=SCHED_FIFO, пÑиоÑиÑеÑ=10

       Рпоказанном вÑÑе вÑводе можно видеÑÑ
       пÑиоÑиÑÐµÑ Ð¸ алгоÑиÑм планиÑованиÑ, коÑоÑÑе
       бÑли взÑÑÑ Ð¸Ð· Ñоздаваемой ниÑи, а не из
       обÑекÑа аÑÑибÑÑов ниÑи.

       ÐамеÑим, ÑÑи еÑли не ÑказаÑÑ Ð¿Ð°ÑамеÑÑ -i i, Ñо
       вÑвод бÑÐ´ÐµÑ Ñем же ÑамÑм, Ñак как
       PTHREAD_INHERIT_SCHED ÑвлÑеÑÑÑ Ð·Ð½Ð°Ñением по
       ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°ÑÑибÑÑа наÑледованиÑ
       планиÑовÑика.

   ÐÑÑоднÑй код пÑогÑаммÑ

       /* pthreads_sched_test.c */

       #include <pthread.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <errno.h>

       #define handle_error_en(en, msg) \
               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, "ÐÑполÑзование: %s [паÑамеÑÑÑ]\n", prog_name);
           fprintf(stderr, "ÐаÑамеÑÑÑ:\n");
       #define fpe(msg) fprintf(stderr, "\t%s", msg);       /* Ð´Ð»Ñ ÐºÑаÑкоÑÑи */
           fpe("-a<алгоÑиÑм><пÑиоÑиÑеÑ> ÐлгоÑиÑм и пÑиоÑиÑÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ\n");
           fpe("                 обÑекÑе аÑÑибÑÑов ниÑи\n");
           fpe("                 знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ <алгоÑиÑм>:\n");
           fpe("                     f  SCHED_FIFO\n");
           fpe("                     r  SCHED_RR\n");
           fpe("                     o  SCHED_OTHER\n");
           fpe("-A               ÐÑп. обÑÐµÐºÑ Ð°ÑÑибÑÑов ниÑи по ÑмолÑаниÑ\n");
           fpe("-i {e|i}         ÐÑÑибÑÑ Ð½Ð°ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика\n");
           fpe("                 'ÑвнÑй' or 'ÑнаÑледованнÑй'\n");
           fpe("-m<алгоÑиÑм><пÑиоÑиÑеÑ> ÐлгоÑиÑм и пÑиоÑиÑÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ\n");
           fpe("               главной ниÑи пеÑед вÑзовом pthread_create()\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, struct sched_param *param)
       {
           printf("    алгоÑиÑм=%s, пÑиоÑиÑеÑ=%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("ÐÑÑибÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика в новой ниÑи");

           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;

           /* обÑабоÑка паÑамеÑÑов командной ÑÑÑоки */

           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], "ÐеизвеÑÑнÑй паÑамеÑÑ\n");
               }
           }

           if (use_null_attrib &&
                   (inheritsched_str != NULL || attr_sched_str != NULL))
               usage(argv[0], "ÐелÑÐ·Ñ ÑказÑваÑÑ -A вмеÑÑе Ñ -i или -a\n");

           /* необÑзаÑелÑÐ½Ð°Ñ ÑÑÑановка аÑÑибÑÑов планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ниÑи
              вÑвод ÑÑÐ¸Ñ Ð°ÑÑибÑÑов */

           if (main_sched_str != NULL) {
               if (!get_policy(main_sched_str[0], &policy))
                   usage(argv[0], "ÐекоÑÑекÑ. алгоÑиÑм Ð´Ð»Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ниÑи (-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("ÐаÑÑÑойки планиÑовÑика главной ниÑи");
           printf("\n");

           /* иниÑиализаÑÐ¸Ñ Ð¾Ð±ÑекÑа аÑÑибÑÑов ниÑи ÑоглаÑно паÑамеÑÑам */

           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], "ÐнаÑение -i должно бÑÑÑ 'e' или '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],
                           "ÐекоÑÑекÑнÑй алгоÑиÑм Ð´Ð»Ñ '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 (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("ÐаÑÑÑойки планиÑовÑика в 'attr'\n");
               display_sched_attr(policy, &param);

               s = pthread_attr_getinheritsched(&attr, &inheritsched);
               printf("    наÑледование планиÑовÑика %s\n",
                       (inheritsched == PTHREAD_INHERIT_SCHED)  ? "ÐÐÐЮЧÐÐÐ" :
                       (inheritsched == PTHREAD_EXPLICIT_SCHED) ? "ЯÐÐÐÐ" :
                       "???");
               printf("\n");
           }

           /* ÑоздаÑм ниÑÑ, коÑоÑÐ°Ñ Ð¿Ð¾ÐºÐ°Ð¶ÐµÑ Ñвои аÑÑибÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ */

           s = pthread_create(&thread, attrp, &thread_start, NULL);
           if (s != 0)
               handle_error_en(s, "pthread_create");

           /* ÑниÑÑожаем ненÑжнÑй обÑÐµÐºÑ Ð°ÑÑибÑÑов ниÑи */

           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)



Linux                             2015-08-08          PTHREAD_SETSCHEDPARAM(3)