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
如果对你有帮助,可以使用微信打赏博主一瓶水