(gcc.info.gz) Thread-Local
Info Catalog
(gcc.info.gz) Unnamed Fields
(gcc.info.gz) C Extensions
(gcc.info.gz) Binary constants
5.54 Thread-Local Storage
=========================
Thread-local storage (TLS) is a mechanism by which variables are
allocated such that there is one instance of the variable per extant
thread. The run-time model GCC uses to implement this originates in
the IA-64 processor-specific ABI, but has since been migrated to other
processors as well. It requires significant support from the linker
(`ld'), dynamic linker (`ld.so'), and system libraries (`libc.so' and
`libpthread.so'), so it is not available everywhere.
At the user level, the extension is visible with a new storage class
keyword: `__thread'. For example:
__thread int i;
extern __thread struct state s;
static __thread char *p;
The `__thread' specifier may be used alone, with the `extern' or
`static' specifiers, but with no other storage class specifier. When
used with `extern' or `static', `__thread' must appear immediately
after the other storage class specifier.
The `__thread' specifier may be applied to any global, file-scoped
static, function-scoped static, or static data member of a class. It
may not be applied to block-scoped automatic or non-static data member.
When the address-of operator is applied to a thread-local variable, it
is evaluated at run-time and returns the address of the current thread's
instance of that variable. An address so obtained may be used by any
thread. When a thread terminates, any pointers to thread-local
variables in that thread become invalid.
No static initialization may refer to the address of a thread-local
variable.
In C++, if an initializer is present for a thread-local variable, it
must be a CONSTANT-EXPRESSION, as defined in 5.19.2 of the ANSI/ISO C++
standard.
See ELF Handling For Thread-Local Storage
(http://people.redhat.com/drepper/tls.pdf) for a detailed explanation of
the four thread-local storage addressing models, and how the run-time
is expected to function.
Menu
* C99 Thread-Local Edits
* C++98 Thread-Local Edits
Info Catalog
(gcc.info.gz) Unnamed Fields
(gcc.info.gz) C Extensions
(gcc.info.gz) Binary constants
automatically generated by
info2html