为了账号安全,请及时绑定邮箱和手机立即绑定

在C ++ 11中thread_local是什么意思?

在C ++ 11中thread_local是什么意思?

杨魅力 2019-11-25 10:35:00
我对thread_localC ++ 11中的描述感到困惑。我的理解是,每个线程在函数中都有局部变量的唯一副本。全局/静态变量可以被所有线程访问(可能使用锁进行同步访问)。而且thread_local变量对所有线程都是可见的,但是只能由为其定义的线程修改?这是对的吗?
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

线程本地存储在各个方面都像静态(=全局)存储一样,只是每个线程都具有对象的单独副本。对象的生命周期从线程启动(对于全局变量)或首次初始化(对于块局部静态变量)开始,并在线程结束(即,何时join()调用)时结束。


因此,只能将也可以声明的变量static声明为thread_local,即全局变量(更确切地说:“在命名空间范围内”的变量),静态类成员和块静态变量(在这种情况下static隐含)。


例如,假设您有一个线程池,并且想知道您的工作负载平衡得如何:


thread_local Counter c;


void do_work()

{

    c.increment();

    // ...

}


int main()

{

    std::thread t(do_work);   // your thread-pool would go here

    t.join();

}

这将打印线程使用情况统计信息,例如使用以下实现:


struct Counter

{

     unsigned int c = 0;

     void increment() { ++c; }

     ~Counter()

     {

         std::cout << "Thread #" << std::this_thread::id() << " was called "

                   << c << " times" << std::endl;

     }

};


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 1112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信