thread_local 用法

文章讨论了C++中全局变量、局部变量以及使用`thread_local`修饰的变量在线程中的行为。全局和局部变量在每个线程中都有独立的副本,而`thread_local`变量只在每个线程创建时初始化一次,确保线程间的隔离。类成员变量若用`thread_local`修饰,则必须是静态的,其值对类的不同实例是独立的。
摘要由CSDN通过智能技术生成

全局变量

独立线程拥有独立变量对象。作用域为全局,生命周期为依附的线程生命周期。

局部变量

独立的线程拥有独立变量对象,作用域为局部作用域,生命周期为依附的线程生命周期。(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;	
}

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值