基础
detach()的作用是将子线程和主线程的关联分离,也就是说detach()后子线程在后台独立继续运行,主线程无法再取得子线程的控制权,即使主线程结束,子线程未执行也不会结束。当主线程结束时,由运行时库负责清理与子线程相关的资源。实际应用如让一个文字处理应用同时编辑多个文档,让每个文档处理窗口拥有自己的线程,每个线程运行同样的代码,并隔离不同窗口处理的数据。
1 #include <thread> 2 #include <iostream> 3 4 using namespace std; 5 6 void func() 7 { 8 cout << "子线程func开始执行!" << endl; 9 //do something 10 cout << "子线程func执行结束!" << endl; 11 } 12 13 int main() 14 { 15 cout << "主线程main开始执行!" << endl; 16 thread t(func); 17 t.detach(); 18 cout << "主线程main执行结束!" << endl; 19 return 0; 20 }
注意
detach()同时也带来了一些问题,如子线程要访问主线中的对象,而主线中的对象又因为主线程结束而被销毁时,会导致程序崩溃。所以传递参数时需要注意一些陷阱。关于参数传递:https://www.cnblogs.com/chen-cs/p/13056703.html
1、访问主线程对象以及指针问题
2、构造线程时隐式转换问题,子线程可以还来不及转换,主线程对象就销毁了,解决方法是构造线程时,构造一个临时对象传入。