线程局部存储(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 的值。
声明和使用线程局部变量
可以使用宏 Z_THREAD_LOCAL 声明线程局部变量。
例如,在头文件中声明线程局部变量:
extern Z_THREAD_LOCAL int i;
并在源文件中定义实际变量:
Z_THREAD_LOCAL int i;
还可以使用关键字 static 将变量的作用域限制在一个源文件内:
static Z_THREAD_LOCAL int j;
线程局部变量的用法与其他变量相同,例如:
void testing(void) {
i = 10;
}