Thread Local Storage (TLS)

Thread Local Storage (TLS) allows variables to be allocated on a per-thread basis. These variables are stored in the thread stack which means every thread has its own copy of these variables.

Zephyr currently requires toolchain support for TLS.

Configuration

To enable thread local storage in Zephyr, CONFIG_THREAD_LOCAL_STORAGE needs to be enabled. Note that this option may not be available if the architecture or the SoC does not have the hidden option CONFIG_ARCH_HAS_THREAD_LOCAL_STORAGE enabled, which means the architecture or the SoC does not have the necessary code to support thread local storage and/or the toolchain does not support TLS.

CONFIG_ERRNO_IN_TLS can be enabled together with CONFIG_ERRNO to let the variable errno be a thread local variable. This allows user threads to access the value of errno without making a system call.

Declaring and Using Thread Local Variables

The macro Z_THREAD_LOCAL can be used to declare thread local variables.

For example, to declare a thread local variable in header files:

extern Z_THREAD_LOCAL int i;

And to declare the actual variable in source files:

Z_THREAD_LOCAL int i;

Keyword static can also be used to limit the variable within a source file:

static Z_THREAD_LOCAL int j;

Using the thread local variable is the same as using other variable, for example:

void testing(void) {
    i = 10;
}