我目前有一个包含一些全局变量的库。我想让这些变量成为本地线程,所以我在它们前面添加了“__thread”说明符。它完成了这项工作,但编译器对这些变量发出“定义但未使用”警告。我用“-Wno-unused-variable”隐藏了警告,但我想知道为什么会发生这种情况,因为这些变量实际上正在库中使用。
如果它们确实是用
static
声明的,如注释中所示,那么您的编译器可能是正确的,这只是浪费资源,因为您正在每个编译单元中创建一个新的线程局部变量。
如果您希望全局变量的
static
分配更改为线程局部变量的合理使用,您必须做更多的事情。使用这样的声明
extern thread_local double eps;
在你的头文件和定义中
thread_local double eps;
仅在您的
.c
文件之一中。
另请注意,线程局部变量现在是 C 标准 (C11) 的一部分,并且关键字是
_Thread_local
,标准“缩写”为 thread_local
。如果您的编译器尚不支持此功能,您可以轻松地将 #define
有条件地设置为 __thread
或任何为您提供该功能的编译器扩展。