一、传递临时对象作为线程参数
1.1 要避免的陷阱1
#include<iostream>
#include<thread>
using namespace std;
void myprint(const int &i,char* pmybuf) {
cout << i << endl;
cout << pmybuf << endl;
return;
}
int main() {
int mvar = 6;
int &myvar = mvar;
char mybuf[] = "MD-DynamicDebug";
thread myobj(myprint,mvar,mybuf);
myobj.join();
cout << "主线程运行结束..." << endl;
system("pause");
return 0;
}
如果以detach方式创建线程
- mvar是否安全?
分析认为:i并不是mvar的引用,实际是值传递。那么我们认为,即便主线程detach子线程,那么子线程中用i值仍然是安全的
1.2 要避免的陷阱2
- mybuf是否安全
指针在detach子线程时,绝对会有问题
考虑传字符串解决方法解决
#include<iostream>
#include<thread>
using namespace std;
void myprint(const int i, const string& pmybuf) {
cout << i << endl;
cout << pmybuf.c_str() << endl;
return;
}
int main() {
int mvar = 6;
int &myvar = mvar;
char mybuf[] = "MD-DynamicDebug";
thread myobj(myprint, mvar, mybuf);
myobj.join();
cout << "主线程运行结束..." << endl;
system("pause");
return 0;
}
但是mybuf到底是在什么时候转换成string的
事实上存在mybuf被回收了(main函数执行完了),系统采用mybuf去转string的可能性
直接将mybuf转换成string对象,这是一个可以保证在线程中用肯定有效的对象
#include<iostream>
#include<thread>
using namespace std;
class A {
public:
//类型转换构造函数,可以把一个int转换成一个类对象
A(int i) :m_i(i) {
cout << "构造函数执行。。" << endl;
}
A(const A&a) :m_i(a.m_i) {
cout << "拷贝函数执行。。" << endl;
}
~A() {
cout << "析构函数执行。。" << endl;
}
private:
int m_i;
};
void myprint4(const int i, const A &pmybuf) {
cout << &pmybuf << endl;//这里打印的是pmybuf对象的
return;
}
int main() {
int mvar = 1;
int mysecondpar = 12;
thread myobj4(myprint4, mvar, mysecondpar);//我们希望mysecondpar转成A类型对象传递给myprint的第二个参数
myobj4.join();
cout << "主线程运行结束..." << endl;
system("pause");
return 0;
}
#include<iostream>
#include<thread>
using namespace std;
class A {
public:
//类型转换构造函数,可以把一个int转换成一个类对象
A(int i) :m_i(