The __thread storage class specifier (IBM extension)

The __thread storage class marks a static variable as having thread-local storage duration. This means that, in a multi-threaded application, a unique instance of the variable is created for each thread that uses it, and destroyed when the thread terminates. The __thread storage class specifier can provide a convenient way of assuring thread-safety: declaring an object as per-thread allows multiple threads to access the object without the concern of race conditions, while avoiding the need for low-level programming of thread synchronization or significant program restructuring.

The tls_model attribute allows source-level control for the thread-local storage model used for a given variable. The tls_model attribute must specify one of local-exec, initial-exec, local-dynamic, or global-dynamic access method, which overrides the -qtls option for that variable. For example:
__thread int i __attribute__((tls_model("local-exec")));

The tls_model attribute allows the linker to check that the correct thread model has been used to build the application or shared library. The linker/loader behavior is as follows:

Table 1. Link time/runtime behavior for thread access models
Access method Link-time diagnostic Runtime diagnostic
local-exec Fails if referenced symbol is imported. Fails if module is not the main program. Fails if referenced symbol is imported (but the linker should have detected the error already).
initial-exec None. dlopen()/load() fails if referenced symbol is not in the module loaded at execution time.
local-dynamic Fails if referenced symbol is imported. Fails if referenced symbol is imported (but the linker should have detected the error already).
global-dynamic None. None.
Note: In order for the __thread keyword to be recognized, you must compile with the -qtls option. See -qtls for details.
The specifier can be applied to any of the following:
  • global variables
  • file-scoped static variables
  • function-scoped static variables
  • C++ only static data members of a class
It cannot be applied to function-scoped automatic variables or non-static data members.
The thread specifier can be either preceded or followed by the static or extern specifier.
__thread int i;      
extern __thread struct state s;      
static __thread char *p;

Variables marked with the __thread specifier can be initialized or uninitialized.

C++ only __thread variables must be initialized with a constant expression, and must not have a static constructor.

Applying the address-of operator (&) to a thread-local variable returns the runtime address of the current thread's instance of the variable. That thread can pass this address to any other thread; however, when the first thread terminates, any pointers to its thread-local variables become invalid.