#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;
}
C++多线程并发第二讲(如何创建线程)
于 2023-09-13 14:57:13 首次发布