9.10.1 Thread Qualifier

The compiler's Thread-Local Storage (TLS) feature ensures that the compiler and libraries create an independent instance of each __thread-qualified object in each thread executed by the program. Thus, because they are not shared, these objects are accessed without data corruption or unexpected behavior across multiple threads and are known as thread-safe objects.

Thread-safe objects can be initialized when they are defined, if required. They cannot use the persistent or address attributes, but they can, however, be placed in a user-defined section using the section attribute. Objects with automatic storage duration are inherently thread safe, so using the __thread qualifier with them makes no sense, but objects with permanent storage duration can be made thread-safe. Use of the space(data) attribute with the __thread qualifier is valid but has no effect; use of the space(prog) attribute and this qualifier will result in an error.

The following examples are valid definitions of thread-safe objects that use the TLS feature implemented by the compiler.
__thread int result;
__thread __attribute__((section("my_section"))) int var = 7;

If the TLS is not enabled, the __thread qualifier is ignored and any object using it is linked and accessed like an ordinary C object.