thr_keycreate(3c) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

thr_keycreate(3c)

thr_keycreate(3C)        Standard C Library Functions        thr_keycreate(3C)

NAME
       thr_keycreate,  thr_keycreate_once,  thr_setspecific, thr_getspecific -
       thread-specific data functions

SYNOPSIS
       #include <thread.h>

       int thr_keycreate(thread_key_t *keyp,
            void (*destructor)(void *));


       int thr_keycreate_once(thread_key_t *keyp,
            void (*destructor)(void *));


       int thr_setspecific(thread_key_t key, void *value);


       int thr_getspecific(thread_key_t key, void **valuep);

DESCRIPTION
   Create Key
       In general, thread key creation allocates a key that locates data  spe‐
       cific  to  each thread in the process. The key is global to all threads
       in the process, which allows each thread to bind a  value  to  the  key
       once the key has been created. The key independently maintains specific
       values  for each binding thread. The thr_keycreate() function allocates
       a global key namespace, pointed to by keyp,  that  is  visible  to  all
       threads in the process. Each thread is initially bound to a private el‐
       ement of this key, which allows access to its thread-specific data.


       Upon  key creation, a new key is assigned the value NULL for all active
       threads. Additionally, upon thread  creation,  all  previously  created
       keys in the new thread are assigned the value NULL.


       Optionally,  a  destructor  function  destructor can be associated with
       each key. Upon thread exit, if a key has a non-null destructor function
       and the thread has a non-null value associated with that key,  the  de‐
       structor  function is called with the current associated value. If more
       than one destructor exists for a thread when it exits, the order of de‐
       structor calls is unspecified.


       An exiting thread runs with all signals blocked. All thread termination
       functions, including thread-specific  data  destructor  functions,  are
       called with all signals blocked.


       The  thr_keycreate_once()  function is identical to the thr_keycreate()
       function except that the key pointed to by keyp must be statically ini‐
       tialized  with  the  value  THR_ONCE_KEY  before  calling   thr_keycre‐
       ate_once() and the key will be created exactly once. This is equivalent
       to  using pthread_once() to call a onetime initialization function that
       calls thr_keycreate() to create the data key.

   Set Value
       Once a key has been created, each thread can bind a new  value  to  the
       key  using  thr_setspecific().  The  values  are  unique to the binding
       thread and are individually maintained. These values continue  for  the
       life of the calling thread.


       Proper synchronization of key storage and access must be ensured by the
       caller.  The value argument to thr_setspecific() is generally a pointer
       to a block of dynamically allocated  memory  reserved  by  the  calling
       thread for its own use. See EXAMPLES below.


       At thread exit, the destructor function, which is associated at time of
       creation,  is called and it uses the specific key value as its sole ar‐
       gument.

   Get Value
       thr_getspecific() stores the current value bound to key for the calling
       thread into the location pointed to by valuep.

RETURN VALUES
       If successful, thr_keycreate(), thr_keycreate_once(), thr_setspecific()
       and thr_getspecific() return 0. Otherwise, an error number is  returned
       to indicate the error.

ERRORS
       If  the  following  conditions  occur,  thr_keycreate() and thr_keycre‐
       ate_once() return the corresponding error number:

       EAGAIN    The system lacked the necessary resources to  create  another
                 thread-specific data key.


       ENOMEM    Insufficient memory exists to create the key.



       If the following conditions occur, thr_setspecific() returns the corre‐
       sponding error number:

       ENOMEM    Insufficient  memory  exists  to associate the value with the
                 key.



       The thr_setspecific() function returns the corresponding error number:

       EINVAL    The key value is invalid.


EXAMPLES
       Example 1 Call the thread-specific data from more than one thread with‐
       out special initialization.



       In this example, the thread-specific  data  in  this  function  can  be
       called  from  more  than one thread without special initialization. For
       each argument passed to the executable, a thread is  created  and  pri‐
       vately bound to the string-value of that argument.




         #include <stdio.h>
         #include <stdlib.h>
         #include <string.h>
         #include <thread.h>

         void *thread_specific_data(void *);
         void cleanup(void*);
         #define MAX_ARGC 20
         thread_t tid[MAX_ARGC];
         int num_threads;

         int
         main(int argc, char *argv[]) {
           int i;
           num_threads = argc - 1;
           for (i = 0; i < num_threads; i++)
              thr_create(NULL, 0, thread_specific_data, argv[i+1], 0, &tid[i]);
           for (i = 0; i < num_threads; i++)
              thr_join(tid[i], NULL, NULL);
           return (0);
         } /* end main */

         void *
         thread_specific_data(void *arg) {
           static thread_key_t key = THR_ONCE_KEY;
           char *private_data = arg;
           void *tsd = NULL;
           void *data;

           thr_keycreate_once(&key, cleanup);
           thr_getspecific(key, &tsd);
           if (tsd == NULL) {
                data = malloc(strlen(private_data) + 1);
                strcpy(data, private_data);
                thr_setspecific(key, data);
                thr_getspecific(key, &tsd);
           }
           printf("tsd for %d = %s\n", thr_self(), (char *)tsd);
           thr_getspecific(key, &tsd);
           printf("tsd for %d remains %s\n", thr_self(), (char *)tsd);
           return (NULL);
         } /* end thread_specific_data */

         void
         cleanup(void *v) {
           /* application-specific clean-up function */
           free(v);
         }


ATTRIBUTES
       See attributes(7) for descriptions of the following attributes:

       tab()  box; cw(2.75i) |cw(2.75i) lw(2.75i) |lw(2.75i) ATTRIBUTE TYPEAT‐
       TRIBUTE VALUE _ Interface StabilityCommitted _ MT-LevelMT-Safe


SEE ALSO
       pthread_once(3C), thr_exit(3C), attributes(7), standards(7)

WARNINGS
       The thr_getspecific() and thr_setspecific() functions can be called ei‐
       ther explicitly or implicitly from a  thread-specific  data  destructor
       function.  Calling  thr_setspecific()  from  a destructor can result in
       lost storage or infinite loops.

Oracle Solaris 11.4               15 May 2014                thr_keycreate(3C)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3