线程头文件:#include<thread>
1.以函数方法创建线程:
//1.写一个创建的线程执行的函数
void myprint()
{
cout<<"xdxc"<<endl;
cout<<"wdxcjs"<<endl;
}
//2.创建的线程
第一种方式:
(1)std::thread mytobj(myprint);//创建一个线程对象并且启动线程
(2)mytobj.join();//主线程等待mytobj执行完毕在执行
第二种方式:
(1)std::thread mytobj(myprint);//创建一个线程对象并且启动线程
(2)mytobj.detach();//主线程不用等待子线程执行结束,自己就可以先结束,主线程内存由c++运行库回收
提示:写了一种方式就不能在用另外一种方式,也不能重复写一种方式,如果这样写就会报错。
判断线程有没有用过哪一种方式:
if(mytobj.joinable())
{
}
注:如果线程执行的函数有参数,那么std::thread构造函数从第二个参数开始就是线程执行函数的参数以此类推,但是如果是以主线程不等待子线程的方式开启的线程传递类对象参数有隐式转化的话,可能会主线程执行完了子线程还没有隐私转化完成,又因为隐私转化是在子线程里面进行的,所以可能会出错。
传递类对象应该以匿名对象的方式传送就不会出现问题,因为匿名对象是在主线程中完成的比如string hh="saxa";string(hh);。
结论:
(1)传递int这样的类型尽量不用传送引用,更加不用传送指针。
(2)类对象传送引用,以匿名的方式传送。
(3)不管传送引用还是赋值都是拷贝,并不是本身地址,指针除外。
(4)如果传送引用执意要传送本身的真实地址用std::ref(hh);
(5)或取线程id号的方法:std::this_thread::get_id();
2.以对象方式创建线程:
1.创建一个用来线程执行的类;
class TB
{
public:
void operator()()
{
cout<<"这个是一个子线程"<<end;