测试detach的坑
class A {
public:
int m_i;
A(int a) :m_i(a) { cout << "Construction" << endl; }
A(const A& a) :m_i(a.m_i) { cout << "Copy Construction" << endl; }
~A() { cout << "Destruction" << endl; }
};
void getThread(const int i, const A& arr) {
cout << "i=" << i << endl;
cout << "arr=" << &arr << ", child_thread_id=" << this_thread::get_id() << endl;
}
int main(int argc, char* argv[]) {
cout << "main_thread_id=" << this_thread::get_id() << endl;
int var = 1;
int par = 12;
thread t1(getThread, var, A(par));
t1.detach();
this_thread::sleep_for(chrono::seconds(5));
return 0;
}
类似上面这样用调用detach,要把par参数传到子线程,而且要把par转换成A类型的参数,需要在thread t1(getThread, var, A(par))
用A()来接,这样构造A对象是在子线程进行,而且可以在主线程执行完之前就把类型构造完毕。
如图所示,构造A对象在子线程进行,这是因为调用了detach,换做join即可 。
传递参数的坑
类对象作为线程参数,用std::ref包装或者用引用符&,可以对该对象本身进行操作且不会再调用拷贝构造函数。其他的参数比如int类型的也可以用相同的方法(也许这样写会有些坑但还没有发现)。
A a(10);
thread t2(getThread2, ref(a));
在有些情况下也可以用std::move()传参,比如传递一个unique_ptr