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;
}
};
- 3 回答
- 0 关注
- 1130 浏览
添加回答
举报