pthread_attr_init

PTHREAD_ATTR_INIÐ(ÑководÑÑво пÑогÑаммиÑÑа LPTHREAD_ATTR_INIT(3)



ÐÐЯ
       pthread_attr_init, pthread_attr_destroy - иниÑиализиÑÑÐµÑ Ð¸
       ÑниÑÑÐ¾Ð¶Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð°ÑÑибÑÑов ниÑи

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

       int pthread_attr_init(pthread_attr_t *attr);
       int pthread_attr_destroy(pthread_attr_t *attr);

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

ÐÐÐСÐÐÐÐ
       ФÑнкÑÐ¸Ñ pthread_attr_init() иниÑиализиÑÑÐµÑ Ð¾Ð±ÑекÑ
       аÑÑибÑÑов ниÑи, на коÑоÑÑй ÑказÑÐ²Ð°ÐµÑ attr,
       знаÑениÑми аÑÑибÑÑов по ÑмолÑаниÑ. ÐоÑле
       ÑÑого вÑзова оÑделÑнÑе аÑÑибÑÑÑ Ð¾Ð±ÑекÑа
       можно изменÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑазлиÑнÑÑ
       ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑÑнкÑий (пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² Ñазделе
       СÐÐТРÐТРТÐÐÐÐ, а поÑле ÑÑого обÑÐµÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾
       иÑполÑзоваÑÑ Ð² одном или неÑколÑкиÑ
       вÑÐ·Ð¾Ð²Ð°Ñ pthread_create(3) Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¸Ñей.

       ÐÑзов pthread_attr_init() Ñ Ñже иниÑиализиÑованнÑм
       обÑекÑом аÑÑибÑÑов ниÑи пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº
       непÑедÑказÑÐµÐ¼Ð¾Ð¼Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ.

       Ðогда обÑÐµÐºÑ Ð°ÑÑибÑÑов ниÑи болÑÑе не нÑжен,
       он должен бÑÑÑ ÑниÑÑожен Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии
       pthread_attr_destroy(). УниÑÑожение обÑекÑа
       аÑÑибÑÑов ниÑи не влиÑÐµÑ Ð½Ð° ниÑÑ, коÑоÑÐ°Ñ Ð±Ñла
       Ñоздана Ñ Ð¸ÑполÑзованием ÑÑого обÑекÑа.

       ÐоÑле ÑниÑÑÐ¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа аÑÑибÑÑов ниÑи его
       можно иниÑиализиÑоваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
       pthread_attr_init() повÑоÑно. ÐÑи иÑполÑзовании
       ÑниÑÑоженного обÑекÑа аÑÑибÑÑов ниÑи дÑÑгим
       ÑпоÑобом пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿ÑедÑказÑемÑм
       ÑезÑлÑÑаÑам.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении ÑÑи ÑÑнкÑии
       возвÑаÑаÑÑ 0; пÑи оÑибке возвÑаÑаеÑÑÑ
       ненÑлевой Ð½Ð¾Ð¼ÐµÑ Ð¾Ñибки.

ÐШÐÐÐÐ
       Ð POSIX.1 опиÑана оÑибка ENOMEM Ð´Ð»Ñ pthread_attr_init();
       в Linux ÑÑи ÑÑнкÑии вÑегда вÑполнÑÑÑÑÑ ÑÑпеÑно
       (Ñем не менее, в пеÑеноÑимÑÑ Ð¿ÑиложениÑÑ
       нÑжно ÑÑиÑÑваÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑа оÑибки).

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

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

ÐÐÐÐЧÐÐÐЯ
       Тип pthread_attr_t должен ÑÑиÑаÑÑÑÑ Ñо ÑкÑÑÑÑм
       ÑоÑмаÑом: лÑбой доÑÑÑп к обÑекÑÑ Ð¿Ð¾Ð¼Ð¸Ð¼Ð¾
       ÑÑнкÑий pthreads ÑвлÑеÑÑÑ Ð½ÐµÐ¿ÐµÑеноÑимÑм и
       пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº непÑедÑказÑемÑм ÑезÑлÑÑаÑам.

ÐÐ ÐÐÐÐ
       РпÑогÑамме, пÑедÑÑавленной ниже, длÑ
       ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ ниÑи иÑполÑзÑеÑÑÑ
       pthread_attr_init() и дÑÑгие ÑÑнкÑии, оÑноÑÑÑиеÑÑ Ðº
       иниÑиализаÑии обÑекÑа аÑÑибÑÑов ниÑи. ÐоÑле
       ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð² ниÑи иÑполÑзÑеÑÑÑ ÑÑнкÑиÑ
       pthread_getattr_np(3) (неÑÑандаÑÑное ÑаÑÑиÑение GNU)
       Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð°ÑÑибÑÑов ниÑи, а заÑем
       показÑваÑÑÑÑ ÑÑи аÑÑибÑÑÑ.

       ÐÑли пÑогÑамма запÑÑкаеÑÑÑ Ð±ÐµÐ· аÑгÑменÑов
       командной ÑÑÑоки, Ñо аÑгÑÐ¼ÐµÐ½Ñ attr ÑÑнкÑии
       pthread_create(3) Ñавен NULL, и поÑÑÐ¾Ð¼Ñ Ð½Ð¸ÑÑ ÑоздаÑÑÑÑ Ñ
       аÑÑибÑÑами по ÑмолÑаниÑ. ÐÑи запÑÑке
       пÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° Linux/x86-32 Ñ ÑеализаÑией ниÑей NPTL
       Ð¼Ñ Ñвидим ÑледÑÑÑее:

           $ ulimit -s       # ÑÑек не огÑаниÑен ==> ÑÐ°Ð·Ð¼ÐµÑ ÑÑека по ÑмолÑÐ°Ð½Ð¸Ñ 2ÐÐ
           unlimited
           $ ./a.out
           ÐÑÑибÑÑÑ Ð½Ð¸Ñи:
                   СоÑÑоÑние оÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ     = PTHREAD_CREATE_JOINABLE
                   ÐблаÑÑÑ                    = PTHREAD_SCOPE_SYSTEM
                   УнаÑледованнÑй планиÑовÑик = PTHREAD_INHERIT_SCHED
                   ÐлгоÑиÑм планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ      = SCHED_OTHER
                   ÐÑиоÑиÑÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ     = 0
                   Ð Ð°Ð·Ð¼ÐµÑ Ð·Ð°ÑиÑÑ              = 4096 байÑ
                   ÐдÑÐµÑ ÑÑека                = 0x40196000
                   Ð Ð°Ð·Ð¼ÐµÑ ÑÑека               = 0x201000 байÑ

       ÐÑли в командной ÑÑÑоке Ð¼Ñ Ñкажем ÑазмеÑ
       ÑÑека, Ñо пÑогÑамма иниÑиализиÑÑÐµÑ Ð¾Ð±ÑекÑ
       аÑÑибÑÑов ниÑи, задаÑÑ ÑазлиÑнÑе аÑÑибÑÑÑ Ð²
       ÑÑом обÑекÑе и пеÑедаÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° обÑÐµÐºÑ Ð²
       вÑзов pthread_create(3). ÐÑи запÑÑке пÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð°
       Linux/x86-32 Ñ ÑеализаÑией ниÑей NPTL Ð¼Ñ Ñвидим
       ÑледÑÑÑее:

           $ ./a.out 0x3000000
           posix_memalign() вÑделен по адÑеÑÑ 0x40197000
           ÐÑÑибÑÑÑ Ð½Ð¸Ñи:
                   СоÑÑоÑние оÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ     = PTHREAD_CREATE_DETACHED
                   ÐблаÑÑÑ                    = PTHREAD_SCOPE_SYSTEM
                   УнаÑледованнÑй планиÑовÑик = PTHREAD_EXPLICIT_SCHED
                   ÐлгоÑиÑм планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ      = SCHED_OTHER
                   ÐÑиоÑиÑÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ     = 0
                   Ð Ð°Ð·Ð¼ÐµÑ Ð·Ð°ÑиÑÑ              = 0 байÑ
                   ÐдÑÐµÑ ÑÑека                = 0x40197000
                   Ð Ð°Ð·Ð¼ÐµÑ ÑÑека               = 0x3000000 байÑ

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

       #define _GNU_SOURCE     /* Ð´Ð»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ pthread_getattr_np() */
       #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
       display_pthread_attr(pthread_attr_t *attr, char *prefix)
       {
           int s, i;
           size_t v;
           void *stkaddr;
           struct sched_param sp;

           s = pthread_attr_getdetachstate(attr, &i);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getdetachstate");
           printf("%sСоÑÑоÑние оÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ     = %s\n", prefix,
                   (i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" :
                   (i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" :
                   "???");

           s = pthread_attr_getscope(attr, &i);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getscope");
           printf("%sÐблаÑÑÑ                    = %s\n", prefix,
                   (i == PTHREAD_SCOPE_SYSTEM)  ? "PTHREAD_SCOPE_SYSTEM" :
                   (i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" :
                   "???");

           s = pthread_attr_getinheritsched(attr, &i);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getinheritsched");
           printf("%sУнаÑледованнÑй планиÑовÑик = %s\n", prefix,
                   (i == PTHREAD_INHERIT_SCHED)  ? "PTHREAD_INHERIT_SCHED" :
                   (i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" :
                   "???");

           s = pthread_attr_getschedpolicy(attr, &i);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getschedpolicy");
           printf("%sÐлгоÑиÑм планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ      = %s\n", prefix,
                   (i == SCHED_OTHER) ? "SCHED_OTHER" :
                   (i == SCHED_FIFO)  ? "SCHED_FIFO" :
                   (i == SCHED_RR)    ? "SCHED_RR" :
                   "???");

           s = pthread_attr_getschedparam(attr, &sp);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getschedparam");
           printf("%sÐÑиоÑиÑÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ     = %d\n", prefix, sp.sched_priority);

           s = pthread_attr_getguardsize(attr, &v);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getguardsize");
           printf("%sÐ Ð°Ð·Ð¼ÐµÑ Ð·Ð°ÑиÑÑ              = %d байÑ\n", prefix, v);

           s = pthread_attr_getstack(attr, &stkaddr, &v);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getstack");
           printf("%sÐдÑÐµÑ ÑÑека                = %p\n", prefix, stkaddr);
           printf("%sÐ Ð°Ð·Ð¼ÐµÑ ÑÑека               = 0x%zx байÑ\n", prefix, v);
       }

       static void *
       thread_start(void *arg)
       {
           int s;
           pthread_attr_t gattr;

           /* pthread_getattr_np() â неÑÑандаÑÑное ÑаÑÑиÑение GNU,
              возвÑаÑÐ°ÐµÑ Ð°ÑÑибÑÑÑ Ð½Ð¸Ñи, Ñказанной в еÑ
              пеÑвом аÑгÑменÑе */

           s = pthread_getattr_np(pthread_self(), &gattr);
           if (s != 0)
               handle_error_en(s, "pthread_getattr_np");

           printf("ÐÑÑибÑÑÑ Ð½Ð¸Ñи:\n");
           display_pthread_attr(&gattr, "\t");

           exit(EXIT_SUCCESS);         /* ÐавеÑÑиÑÑ Ð²Ñе ниÑи */
       }

       int
       main(int argc, char *argv[])
       {
           pthread_t thr;
           pthread_attr_t attr;
           pthread_attr_t *attrp;      /* NULL или &attr */
           int s;

           attrp = NULL;

           /* ÐÑли в командной ÑÑÑоке еÑÑÑ Ð°ÑгÑменÑ, Ñо иÑполÑзоваÑÑ ÐµÐ³Ð¾
              Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð°ÑÑибÑÑа ÑазмеÑа ÑÑека и еÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð°ÑÑибÑÑов
              ниÑи, и attrp бÑÐ´ÐµÑ ÑказÑваÑÑ Ð½Ð° обÑÐµÐºÑ Ð°ÑÑибÑÑов ниÑи */

           if (argc > 1) {
               int stack_size;
               void *sp;

               attrp = &attr;

               s = pthread_attr_init(&attr);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_init");

               s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_setdetachstate");

               s = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_setinheritsched");

               stack_size = strtoul(argv[1], NULL, 0);

               s = posix_memalign(&sp, sysconf(_SC_PAGESIZE), stack_size);
               if (s != 0)
                   handle_error_en(s, "posix_memalign");

               printf("posix_memalign() вÑделен по адÑеÑÑ %p\n", sp);

               s = pthread_attr_setstack(&attr, sp, stack_size);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_setstack");
           }

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

           if (attrp != NULL) {
               s = pthread_attr_destroy(attrp);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_destroy");
           }

           pause();    /* ÐавеÑÑаеÑÑÑ, когда дÑÑÐ³Ð°Ñ Ð½Ð¸ÑÑ Ð²ÑзÑÐ²Ð°ÐµÑ exit() */
       }

СÐÐТРÐТРТÐÐÐÐ
       pthread_attr_setaffinity_np(3), pthread_attr_setdetachstate(3),
       pthread_attr_setguardsize(3), pthread_attr_setinheritsched(3),
       pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3),
       pthread_attr_setscope(3), pthread_attr_setstack(3),
       pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3),
       pthread_create(3), pthread_getattr_np(3), pthreads(7)



Linux                             2015-07-23              PTHREAD_ATTR_INIT(3)