[Return to Bookshelf] [Contents] [Previous Section] [Next Section] [Index] [Help]


pthread_key_create

Generates a unique thread-specific data key.

Syntax

pthread_key_create(
                   key,
                   destructor );
 


Argument Data Type Access

key opaque pthread_key_t write destructor procedure read


C Binding

#include 

int pthread_key_create ( pthread_key_t *key, void (*destructor)(void *));

Arguments

key
The new thread-specific data key.
destructor
Procedure called to destroy a thread-specific data value associated with the created key when the thread terminates. Note, the argument to the destructor for the user-specified routine is the non-NULL value associated with a key.

Description

This routine generates a unique, thread-specific data key that is visible to all threads in the process. The variable key provided by this routine is an opaque object used to locate thread-specific data. Although the same key value may be used by different threads, the values bound to the key by pthread_ setspecific are maintained on a per-thread basis and persist for the life of the calling thread.

Thread-specific data allows client software to associate "static" information with the current thread. For example, where a routine declares a variable "static" in a single-threaded program, a multithreaded version of the program might create a thread-specific data key to store the same variable.

This routine generates and returns a new key value. The key reserves a cell within each thread. Each call to this routine creates a new cell that is unique within an application invocation. Keys must be generated from initialization code that is guaranteed to be called only once within each process. (See the pthread_once description for more information.)

When a thread terminates, its thread-specific data is automatically destroyed; however, the key remains unless destroyed by a call to pthread_key_delete. An optional destructor function may be associated with each key. At thread exit, if a key has a non-NULL destructor pointer, and the thread has a non-NULL value associated with that key, the destructor function is called with the current associated value as its sole argument. The order in which thread- specific data destructors are called at thread termination is undefined.

Before each destructor is called, the thread's value for the corresponding key is set to NULL. After the destructors have been called for all non-NULL values with associated destructors, if there are still some non-NULL values with associated destructors, then the process is repeated. If there are still non-NULL values for any key with a destructor after four repetitions of this process, DECthreads will terminate the thread. At this point, any key values that represent allocated heap will be lost. Note that this occurs only when a destructor performs some action that creates a new value for some key. Destructor code should attempt to avoid this sort of circularity.

Return Values

If an error condition occurs, this routine returns an integer indicating the type of error. Possible return values are as follows:
Return        Description

0             Successful completion.

[EAGAIN]      The system lacked the necessary resources to create
              another thread-specific data key, or the system-
              imposed limit on the total number of keys per process
              {PTHREAD_KEYS_MAX} has been exceeded.

[ENOMEM]      Insufficient memory exists to create the key.



Associated Routines

   pthread_getspecific
   pthread_setspecific
   pthread_key_delete
   pthread_once



[Return to Bookshelf] [Contents] [Previous Section] [Next Section] [Index] [Help]