【问题标题】:Getting "define but not used" warning when using gcc "__thread" specifier使用 gcc“__thread”说明符时收到“定义但未使用”警告
【发布时间】:2013-12-07 04:52:21
【问题描述】:

我目前有一个包含一些全局变量的库。我想让这些变量线程本地化,所以我在它们前面添加了“__thread”说明符。它完成了这项工作,但编译器对这些变量给出了“定义但未使用”的警告。我用“-Wno-unused-variable”隐藏了警告,但我想知道为什么会发生这种情况,因为这些变量实际上是在库中使用的。

谢谢!

【问题讨论】:

  • 它们是静态的还是外部的?
  • @R.. 它们是静态的。而且我认为它们正在被库函数使用,并且在添加“__thread”说明符后它们的行为确实符合预期。看到这些警告很烦人,我想知道我是否做错了什么。
  • 如果它们是静态的,那么唯一可能使用它们的地方就是它们定义在同一个 .c 文件中。我怀疑你的库函数使用的是 不同的 恰好同名的全局变量...

标签: c multithreading gcc compiler-construction thread-safety


【解决方案1】:

如果它们真的是用static 声明的,如注释中所示,您的编译器可能是正确的,这只是浪费资源,因为您正在每个编译单元中创建一个新的线程局部变量。

如果您希望将全局变量的static 分配更改为对线程局部变量的合理使用,您必须做更多的事情。像这样使用声明

extern thread_local double eps;

在你的头文件和定义中

thread_local double eps;

仅在您的一个 .c 文件中。

还要注意,线程局部变量现在是 C 标准 (C11) 的一部分,并且那里的关键字是 _Thread_local,标准“缩写”为 thread_local。如果您的编译器还不支持此功能,您可以轻松地将 #define 有条件地转换为 __thread 或任何为您提供该功能的编译器扩展。

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多