thread创建线程的一些坑
Posted 桃浪十七丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thread创建线程的一些坑相关的知识,希望对你有一定的参考价值。
测试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
以上是关于thread创建线程的一些坑的主要内容,如果未能解决你的问题,请参考以下文章
ThreadLoacl,InheritableThreadLocal,原理,以及配合线程池使用的一些坑