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

先看代码:

#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了。难道是不能在线程函数里面改变类对象的值吗。我查阅了很多资料都没解决。即使传递指针等都不行。最后发现一个神奇现象,代码如下:

#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的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值