立即学习:https://edu.youkuaiyun.com/course/play/9377/196522?utm_source=blogtoedu
thread
join
detach
joinable
1. 传递临时对象作为线程参数
1.1要避免的陷阱
子线程的临时变量按引用传递是复制的,并不引用原来的地址。
detach子线程,绝对不能用指针,否则主线程结束,子线程出错。仍不推荐用引用。
1.2要避免的陷阱
类型转换构造函数,class A(int i);一个参数的构造函数
thread myjob(mypoint, myvar, string(char_ptr));
要在thread创建时进行转换。
1.3 总结
只要用临时构造的A类对象传递给子线程,那么一定能在主线程执行完毕前把变量传递给子线程。A(12)。不能隐式转换。
使用detach时:
若传递简单参数(如整数),推荐值传递。
若传递对象,避免隐式转换,全部在创建线程这一行构建出临时对象来,然后在函数内部用引用来接,否则会多构造一次,浪费。
终极建议:不用detach,只使用join;这样可以解决局部变量失效导致的非法引用问题。
2. 临时对象作为线程参数继续
2.1 线程id概念
线程id是个数字,每个线程都对应一个数字,线程不同,ID不同。std:: this_thread.getID()来获取;
2.2临时对象构造时机抓捕
3.传递类对象,智能指针作为线程参数
//std::ref()
如果想使用引用特性,在子线程中的修改传递到主线程,使用ref
class mobj;
thread myjob(myvar,std::ref(mobj));
智能指针
unique_ptr<int> myp(new int(100));
std::thread myobj(std::move(myp));
4.用成员函数指针做线程函数。
std::ref或者 &A::threadwork,后面跟参数。