全局变量
独立线程拥有独立变量对象。作用域为全局,生命周期为依附的线程生命周期。
局部变量
独立的线程拥有独立变量对象,作用域为局部作用域,生命周期为依附的线程生命周期。(static 作用域为局部作用域,生命周期直到程序结束)。
for (int i = 0; i < 3; ++i) {
thread_local int x = 1; //只在每个线程创建时初始化一次
x++;
std::lock_guard<std::mutex> lock(cout_mutex);
std::cout << "thread[" << thread_name << "]: x = " << x << std::endl;
}
只在每个线程创建时初始化一次
类成员变量
thread_local 作为类成员变量时必须是 static 的。
class MyClass {
public:
static thread_local int m_threadLocal; //线程共有
static int m_staticValue; //类共有
int m_value{0}; //对象特有
};
// 在类外初始化静态成员变量
thread_local int MyClass::m_threadLocal = 0;
int MyClass::m_staticValue = 0;
int main()
{
MyClass obj1;
MyClass obj2;
std::thread thread1([&]() {
obj1.m_threadLocal = 10;
MyClass::m_staticValue = 10;
obj1.m_value = 10;
//std::cout << obj1.m_threadLocal << std::endl; // 输出结果为10
});
std::thread thread2([&]() {
obj2.m_threadLocal = 20;
MyClass::m_staticValue = 20;
obj2.m_value = 20;
});
thread1.join();
thread2.join();
//这里m_threadLocal为0是由于thread_local修饰了该变量,上面只修改了子线程中的对象
std::cout << obj1.m_threadLocal << " " << MyClass::m_staticValue << " " << obj1.m_value << std::endl; // 输出结果为0 20 10
std::cout << obj2.m_threadLocal << " " << MyClass::m_staticValue << " " << obj2.m_value << std::endl; // 输出结果为0 20 20
//这里obj1和obj2属于同一线程,m_threadLocal是同一对象
obj1.m_threadLocal = 30;
obj2.m_threadLocal = 0;
std::cout << obj1.m_threadLocal << std::endl; // 输出结果为0
std::cout << obj2.m_threadLocal << std::endl; // 输出结果为0
//这里obj1和obj2属于同一线程,m_threadLocal是同一对象
obj1.m_threadLocal = 30;
std::cout << obj1.m_threadLocal << std::endl; // 输出结果为30
std::cout << obj2.m_threadLocal << std::endl; // 输出结果为30
return 0;
}