35.1.6 Thread-local Storage

The GNU C Library implements functions to provide thread-local storage, a mechanism by which variables can be defined to have unique per-thread storage, lifetimes that match the thread lifetime, and destructors that cleanup the unique per-thread storage.

Several data types and macros exist for working with thread-local storage:

Data Type: tss_t

The tss_t data type identifies a thread-specific storage object. Even if shared, every thread will have its own instance of the variable, with different values.

Data Type: tss_dtor_t

The tss_dtor_t is a function pointer of type void (*) (void *), to be used as a thread-specific storage destructor. The function will be called when the current thread calls thrd_exit (but never when calling tss_delete or exit).

Macro: thread_local

thread_local is used to mark a variable with thread storage duration, which means it is created when the thread starts and cleaned up when the thread ends.

Note: For C++, C++11 or later is required to use the thread_local keyword.

Macro: TSS_DTOR_ITERATIONS

TSS_DTOR_ITERATIONS is an integer constant expression representing the maximum number of iterations over all thread-local destructors at the time of thread termination. This value provides a bounded limit to the destruction of thread-local storage; e.g., consider a destructor that creates more thread-local storage.

The following functions are used to manage thread-local storage:

Function: int tss_create (tss_t *tss_key, tss_dtor_t destructor)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

tss_create creates a new thread-specific storage key and stores it in the object pointed to by tss_key. Although the same key value may be used by different threads, the values bound to the key by tss_set are maintained on a per-thread basis and persist for the life of the calling thread.

If destructor is not NULL, a destructor function will be set, and called when the thread finishes its execution by calling thrd_exit.

This function returns thrd_success if tss_key is successfully set to a unique value for the thread; otherwise, thrd_error is returned and the value of tss_key is undefined.

Function: int tss_set (tss_t tss_key, void *val)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

tss_set sets the value of the thread-specific storage identified by tss_key for the current thread to val. Different threads may set different values to the same key.

This function returns either thrd_success or thrd_error.

Function: void * tss_get (tss_t tss_key)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

tss_get returns the value identified by tss_key held in thread-specific storage for the current thread. Different threads may get different values identified by the same key. On failure, tss_get returns zero.

Function: void tss_delete (tss_t tss_key)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

tss_delete destroys the thread-specific storage identified by tss_key.