C++多线程并发第二讲(如何创建线程)

#include<iostream>
#include<thread>
#include<vector>
#include<string>
using namespace std;

class A
{
public:
	int a;
	A(int m_a) :a(m_a){//类型转换构造函数,当构造函数参数只有一个时,可以吧一个int类型转换成一个类A对象
		cout << "构造函数打印" << endl;
	}
	A(const A& b) : a(b.a) {
		cout << "复制构造函数打印" << endl;
	}
	~A() {
		cout << "析构函数打印" << endl;
	}

};

//void myprint(const int & i, char* pmybuf)
void myprint(const int i,const string pmybuf)
{
	cout << i << endl;//分析认为,i并不是mvar的引用,实际是值传递,那么即使是主线程detach了子线程,子线程中的参数依然可以执行
	cout << pmybuf << endl;//指针指向的地址是相同的,属于地址传递,所以这里用指针做参数是大错特错的
	cout << "子线程的ID" << std::this_thread :: get_id() << endl;
	return;
}

//void myprint(const int i, const A& s)
//{
//	cout << &s << endl;
//}
int main()
{
	//一:传递临时对象作为线程参数
	//(1.1)要避免的陷阱(解释一)
	//总结
	//a:如果传递这种简单类型参数,建议都是值传递,不要用引用
	//b:如果传递类对象,避免隐式类型转换,全部都在创建线程这一行创建出临时对象来
	//建议不使用detach

	 

	int mvar = 1;
	int& mvary = mvar;
	char mybuf[] = "this is a test";
	//thread mytobj(myprint, mvar, mybuf);
	thread mytobj(myprint, mvar, string(mybuf));//提前强制类型转换,这样就不会有主线程结束后,mybuf再转换成string的风险了
	//thread mytobj2(myprint, mvar, A(10));
	
	mytobj.join();
	cout << "主线程结束" << endl;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值