thread_local

📅 2026/7/2 10:57:11
thread_local
C11 标准提供了一个新的关键字thread_local来定义一个线程变量。使用方法如下thread_local int g_mydata 1;有了这个关键字使用线程局部存储的代码同时在 Windows 和 Linux 运行了。示例如下#include thread #include chrono #include iostream thread_local int g_mydata 1; void thread_func1() { while (true) { g_mydata; } } void thread_func2() { while (true) { std::cout g_mydata g_mydata , ThreadID std::this_thread::get_id() std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); } } int main() { std::thread t1(thread_func1); std::thread t2(thread_func2); t1.join(); t2.join(); return 0; }需要注意的是如果读者是在 Windows 平台下虽然thread_local关键字在 C 11 标准中引入但是 Visual Studio 2013 支持 C 11 语法的最低的一个版本编译器却并不支持这个关键字建议在 Visual Studio 2015 及以上版本中测试上述代码。最后关于线程局部存储变量我还再强调两点对于线程变量每个线程都会有该变量的一个拷贝并行不悖互不干扰。该局部变量一直都在直到线程退出为止。系统的线程局部存储区域内存空间并不大所以尽量不要利用这个空间存储大的数据块如果不得不使用大的数据块可以将大的数据块存储在堆内存中再将该堆内存的地址指针存储在线程局部存储区域。