c++多线程之detach的坑

class JackTang
{

public:
	int number;
	JackTang(int a) :number(a)
	{

		cout << "这是构造函数,a:" << a << ",线程ID:" << std::this_thread::get_id() << endl;;
	}

	JackTang(const JackTang &obj)
	{
		number = obj.number;
		cout << "这是Copy构造函数,线程ID:" << std::this_thread::get_id() << endl;;
	}
	~JackTang()
	{
		cout << "这是析构函数,线程ID:" << std::this_thread::get_id() << endl;;
	}
};

void myprint(const int a, const JackTang &obj)
{
	cout << "子线程 id:" << std::this_thread::get_id() << endl;
	cout << "a:" << a << endl;
	cout << "JackTang::number:" << obj.number << endl;

}

void main()
{
	cout <<"主线程id:"<< std::this_thread::get_id() << endl;
	int a = 10;
	int b = 20;
	JackTang &obj
	std::thread t(myprint, a, b/*会发生隐式转换*/);
	t.detach();
	getchar();
}

看结果:
在这里插入图片描述
从结果可以看出隐式转换发生在子线程中,也就是说在子线程中构造了对象。这样使用会有危险,如果主线程退出了,还没有构造出来。或者变量已经失效。
且看下面另一种调用方式

std::thread t(myprint, a, JackTang(b)/*会发生隐式转换*/);
t.detach();

结果:
在这里插入图片描述
从结果可以看出使用了临时对象,对象在主线程中构造出来。
建议:
1.对于int的类型这样简单类型建议使用值传递
2.如果传递类对象类型,避免隐式转换。全部都在创建线程这一行构建出一个临时对象出来。如线程t1;然后再函数参数里用引用来接比如这里的const
如果对你有帮助,可以使用微信打赏博主一瓶水
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值