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,原理,以及配合线程池使用的一些坑

多线程编程总结:二Thread的那些坑和填坑的线程池

入坑两个月,java.lang包下的Thread类

混合 C++11 std::thread 和 C 系统线程(即 pthreads)

c++11 thread多线程创建和传参

C语言创建线程问题(急)