attributes object

       #include <pthread.h>

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

       Compile and link with -pthread.

       The pthread_attr_init()  function  initializes  the  thread  attributes
       object  pointed  to  by attr with default attribute values.  After this
       call, individual attributes of the object  can  be  set  using  various
       related  functions  (listed under SEE ALSO), and then the object can be
       used in one or more pthread_create(3) calls that create threads.

       Calling pthread_attr_init() on a  thread  attributes  object  that  has
       already been initialized results in undefined behavior.

       When  a  thread  attributes  object is no longer required, it should be
       destroyed using  the  pthread_attr_destroy()  function.   Destroying  a
       thread  attributes  object  has  no effect on threads that were created
       using that object.

       Once a thread attributes object has been destroyed, it  can  be  reini-
       tialized  using  pthread_attr_init().   Any  other  use  of a destroyed
       thread attributes object has undefined results.

       On success, these functions return 0; on error, they return  a  nonzero
       error number.

       POSIX.1-2001  documents  an  ENOMEM  error  for pthread_attr_init(); on
       Linux these functions always succeed  (but  portable  and  future-proof
       applications should nevertheless handle a possible error return).


       The  pthread_attr_t type should be treated as opaque: any access to the
       object other than via pthreads functions is  nonportable  and  produces
       undefined results.

       The program below optionally makes use of pthread_attr_init() and vari-
       ous related functions to initialize a thread attributes object that  is
       used  to  create  a  single  thread.  Once created, the thread uses the
       pthread_getattr_np(3)  function  (a  nonstandard  GNU   extension)   to
       retrieve the thread's attributes, and then displays those attributes.

       If  the  program  is  run with no command-line argument, then it passes
                   Scheduling priority = 0
                   Guard size          = 4096 bytes
                   Stack address       = 0x40196000
                   Stack size          = 0x201000 bytes

       When we supply a stack size as a  command-line  argument,  the  program
       initializes a thread attributes object, sets various attributes in that
       object, and passes a pointer to the object in the call to  pthread_cre-
       ate(3).   Running  the  program on Linux/x86-32 with the NPTL threading
       implementation, we see the following:

           $ ./a.out 0x3000000
           posix_memalign() allocated at 0x40197000
           Thread attributes:
                   Detach state        = PTHREAD_CREATE_DETACHED
                   Scope               = PTHREAD_SCOPE_SYSTEM
                   Inherit scheduler   = PTHREAD_EXPLICIT_SCHED
                   Scheduling policy   = SCHED_OTHER
                   Scheduling priority = 0
                   Guard size          = 0 bytes
                   Stack address       = 0x40197000
                   Stack size          = 0x3000000 bytes

   Program source

       #define _GNU_SOURCE     /* To get pthread_getattr_np() declaration */
       #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("%sDetach state        = %s\n", prefix,

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

           s = pthread_attr_getschedpolicy(attr, &i);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getschedpolicy");
           printf("%sScheduling policy   = %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("%sScheduling priority = %d\n", prefix, sp.sched_priority);

           s = pthread_attr_getguardsize(attr, &v);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getguardsize");
           printf("%sGuard size          = %d bytes\n", prefix, v);

           s = pthread_attr_getstack(attr, &stkaddr, &v);
           if (s != 0)
               handle_error_en(s, "pthread_attr_getstack");
           printf("%sStack address       = %p\n", prefix, stkaddr);
           printf("%sStack size          = 0x%x bytes\n", prefix, v);

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

           /* pthread_getattr_np() is a non-standard GNU extension that
              retrieves the attributes of the thread specified in its
              first argument */

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

           printf("Thread attributes:\n");
           display_pthread_attr(&gattr, "\t");

           exit(EXIT_SUCCESS);         /* Terminate all threads */

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

               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() allocated at %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();    /* Terminates when other thread calls 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_set-
       stackaddr(3),     pthread_attr_setstacksize(3),      pthread_create(3),
       pthread_getattr_np(3), pthreads(7)

       This  page  is  part of release 3.35 of the Linux man-pages project.  A
       description of the project, and information about reporting  bugs,  can
       be found at
Man Pages Copyright Respective Owners. Site Copyright (C) 1994 - 2017 Hurricane Electric. All Rights Reserved.