C++类中使用__thread线程本地存储出现未定义符号错误求助
问题原因与解决方法
错误原因
你在类中仅声明了静态线程本地存储变量TestTLS::g_tls_val,但没有在类外部进行定义。C++标准要求,所有静态成员变量(包括线程本地的静态变量)必须在类的作用域之外单独定义,否则链接器无法找到对应的符号,就会抛出"Undefined symbols"错误。
解决步骤
在类定义之外添加静态线程本地变量的定义,注意要保留__thread关键字:
__thread int TestTLS::g_tls_val;
如果需要初始化,可以直接在定义时赋值:
__thread int TestTLS::g_tls_val = 0; // 每个线程启动时都会执行这个初始化
完整修正后的代码示例
struct TestTLS { TestTLS() { TestTLS::g_tls_val = 1; } int getTls() { return TestTLS::g_tls_val; } void setTls(int v) { TestTLS::g_tls_val = v; } private: static __thread int g_tls_val; }; // 必须添加这行定义,否则链接失败 __thread int TestTLS::g_tls_val; int main() { TestTLS tls; int ff = tls.getTls(); tls.setTls(3); int ee = tls.getTls(); return 0; }
补充说明
- 如果使用C++11及以上标准,推荐用标准的
thread_local关键字替代编译器扩展的__thread,兼容性更好:// 类内声明 static thread_local int g_tls_val; // 类外定义 thread_local int TestTLS::g_tls_val; - 线程本地变量的每个线程都有独立副本,初始化操作会在对应线程第一次访问变量时执行,线程间的变量值互不干扰。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

