C++11 关键字thread_local

C++11新增的关键字thread_local,表示对象的生命周期属于线程存储期。

线程局部存储(Thread Local Storage,TLS)是一种存储期(storage duration),对象的存储是在线程开始时分配,线程结束时回收,每个线程有该对象自己的实例


如果类的成员函数内定义了 thread_local 变量,则对于同一个线程内的该类的多个对象都会共享一个变量实例,并且只会在第一次执行这个成员函数时初始化这个变量实例。


thread_local 一般用于需要保证线程安全的函数中。

使用场景:

随机数生成,每个线程维护不同的种子。

线程池,观察每个线程的负载情况。


本质上,就是线程域的全局静态变量。


#include <iostream>
#include <string>
#include <thread>
#include <mutex>
 
thread_local unsigned int rage = 1; 
std::mutex cout_mutex;
 
void increase_rage(const std::string& thread_name){
    ++rage; // modifying outside a lock is okay; this is a thread-local variable
    std::lock_guard<std::mutex> lock(cout_mutex);
    std::cout << "Rage counter for " << thread_name << ": " << rage << '\n';
}
 
int main(){
    std::thread a(increase_rage, "a"), b(increase_rage, "b");
 
    {
        std::lock_guard<std::mutex> lock(cout_mutex);
        std::cout << "Rage counter for main: " << rage << '\n';
    }
 
    a.join();
    b.join();
}

可以看出,主线程、线程a、线程b对变量rage的访问都是独立的。


总结:

  • thread_local描述的对象在thread开始时分配,而在thread结束时回收。
  • 一般在声明时赋值,在本thread中只执行一次。
  • 描述的对象依然只在作用域内有效。
  • 描述类成员变量时,必须是static的。
posted @   天下太平  阅读(264)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示