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/)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1960
文章版权归作者所有,未经允许请勿转载。
THE END