1.106、C++11的thread_local有没有使用过?

我使用过C++11引入的thread_local关键字。它用于声明**线程局部存储(Thread-Local Storage,TLS)**变量,保证每个线程拥有该变量的独立实例,生命周期与线程相同,线程开始时初始化,线程结束时销毁。


关键点总结

  • • 作用thread_local变量在线程内是全局唯一的,但不同线程之间互不干扰,避免了多线程共享数据带来的同步开销和竞态条件。
  • • 适用场景:如线程独立的计数器、随机数种子、日志上下文、错误码(类似errno)等需要线程隔离的状态。
  • • 声明方式
    thread_local int counter = 0;
  • • 生命周期:线程启动时初始化,线程退出时销毁,且每个线程都有自己独立的副本。

使用示例

#include 
#include 

thread_local int counter = 0;

void func(int id) {
    counter += id;
    std::cout << "Thread " << id << ", counter = " << counter << std::endl;
}

int main() {
    std::thread t1(func, 1);
    std::thread t2(func, 2);
    t1.join();
    t2.join();
    return 0;
}

输出中每个线程的counter变量独立维护,互不影响。


优势与注意事项

  • • 避免锁竞争:线程局部变量避免了多线程访问共享数据时的锁开销。
  • • 初始化延迟thread_local变量在每个线程首次使用时初始化。
  • • 限制:只能用于静态存储期变量(全局、静态变量或函数内静态变量),不能用于普通栈变量。
  • • 跨线程传递指针需注意生命周期,避免访问已销毁的线程局部对象。

这种设计极大简化了多线程编程中线程私有数据的管理,是现代C++多线程开发中非常实用且高效的工具。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
个人教程网站内容更丰富:(https://www.1217zy.vip/)

阅读剩余
THE END