线程本地存储(TLS)
线程本地存储(TLS)允许按每个线程分配变量。这些变量存储在线程堆栈中,这意味着每个线程都有自己的这些变量的副本。
Zephyr目前需要对TLS进行工具链的支持。
配置
要在Zephyr中启用线程本地存储,需要启用CONFIG_THREAD_LOCAL_STORAGE
。请注意,如果体系结构或SoC没有启用隐藏选项CONFIG_ARCH_HAS_THREAD_LOCAL_STORAGE
,则此选项可能不可用,这意味着体系结构或SoC没有支持线程本地存储的必要代码和/或工具链不支持TLS。
CONFIG_ERRNO_IN_TLS
可以与CONFIG_ERRNO
一起启用,以使变量errno
成为一个线程本地变量。这允许用户线程访问errno
而不进行系统调用的值。
声明和使用线程本地变量
关键字__thread
可用于声明线程本地变量。
例如,要在标头文件中声明一个线程本地变量:
extern __thread int i;
并在源文件中声明实际的变量:
__thread int i;
关键字static
也可以用于限制源文件中的变量:
static __thread int j;
使用线程局部变量与使用其他变量相同,例如:
void testing(void) {
i = 10;
}