示例代码:
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
mutex m;
thread_local int local_num = 1;
int g_n = 100;
void addLocal()
{
local_num += 10;
lock_guard<mutex> g( m ); //避免输出混乱
cout << "id=" << this_thread::get_id() << ",num=" << local_num << endl;
}
void addShare()
{
g_n += 10;
lock_guard<mutex> g( m ); //避免输出混乱
cout << "id=" << this_thread::get_id() << ",num=" << g_n << endl;
}
void func()
{
thread_local int i = 0;
cout << "i=" << i << endl;
++i;
}
int main()
{
cout << "测试thread_local使用:\n";
thread t1( addLocal );
thread t2( addLocal );
t1.join();
t2.join();
cout << "\n测试普通变量使用:\n";
thread t3( addShare );
thread t4( addShare );
t3.join();
t4.join();
cout << "\n测试thread_local生命周期:\n";
func();
func();
system( "pause" );
return 0;
}
知识点总结:
1、对于普通的全局变量来说,所有线程共享一个副本(有效作用域内)
2、对于 thread_local 来说,每个线程对应自己的一个副本,互不影响
3、thread_local 具有 static 一样的初始化和生命周期特性,只初始化一次,生命周期与线程周期绑定