首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[C++][windows]std::thread线程函数是类的成员函数是否可以在线程函数里面改变类变量的值的问题

[C++][windows]std::thread线程函数是类的成员函数是否可以在线程函数里面改变类变量的值的问题

作者头像
云未归来
发布2025-07-20 11:23:20
发布2025-07-20 11:23:20
1600
举报

先看代码:

代码语言:javascript
复制
#include <iostream>
#include <thread>
#include <string>
using namespace std;

class B
{
public:
	int age = 18;
	void Say()
	{
		std::cout << "Say B" << std::endl;
	}
};


class A
{
public:
	int age = 10;
	void Say()
	{
		std::cout << "Say A" << std::endl;
	}
	void Start()
	{
		B b;
		std::thread t(&A::_start,this);
		t.detach();
	}
	private:
	void _start()
	{
		age++;
		std::cout << "A.age=" <<age<< std::endl;
		Say();
	}

};

int main()
{
	A a;
	a.age = 22;
	a.Start();
	std::cout << "main thread " << a.age << std::endl;

}

输出结果:

main thread 22 A.age=1 Say A

这个输出似乎在_start函数里面,类A的成员age被清空了,变成0,age++后变成1了。难道是不能在线程函数里面改变类对象的值吗。我查阅了很多资料都没解决。即使传递指针等都不行。最后发现一个神奇现象,代码如下:

代码语言:javascript
复制
#include <iostream>
#include <thread>
#include <windows.h>
#include <string>
using namespace std;

class B
{
public:
	int age = 18;
	void Say()
	{
		std::cout << "Say B" << std::endl;
	}
};


class A
{
public:
	int age = 10;
	void Say()
	{
		std::cout << "Say A" << std::endl;
	}
	void Start()
	{
		B b;
		std::thread t(&A::_start,this);
		t.detach();
	}
	private:
	void _start()
	{
		age++;
		std::cout << "A.age=" <<age<< std::endl;
		Say();
	}

};

int main()
{
	A a;
	a.age = 22;
	a.Start();
	Sleep(3000);
	std::cout << "main thread " << a.age << std::endl;

}

输出:

A.age=23 Say A main thread 23

这回居然变了。就加了个延时,可以得出结论是,主进程运行立马退出后,线程函数来不及给类成员变量赋值?导致age变量是0,可能线程函数对age这个变量做了一些拷贝操作,导致不是原来的值。目前只能这么理解。总结:

(1)std::thread线程函数中可以直接改变类的成员变量,但是不是立马就可以改变,如果主线程过快退出,会造成类的成员变量无法改变的假象。这样你就入坑了,怎么也找不到变量为啥是0的原因。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档