前言
本节课我们奖的是C++ 11多线程的创建与使用线程
我们多线程的意义在哪:充分利用CPU资源、简化编程模式、简化异步事件处理、使GUI更有效率…
提示:以下是本篇文章正文内容,下面案例可供参考
创建多线程及lambad表示式的讲解
1.头文件:
多线程的头文件为:#include <thread> using namespace std;
2.怎么创建线程?
首先我们要知道,线程就是一可调用的函数,在C++中,可以使用函数做为入口,也可以用类,类成员函数。main函数也是一个线程,但他是主线程,主线程的结束是在main函数return时,我们自己创建的子线程也是一样:
1).用函数做为入口函数:
void myprint() { cout << "my name is \"my print\"" << endl; } int main() { thread t(myprint);//创建一个入口函数为myprint子线程 return 0; }
2.用一个类作入口函数
class A { public: void operator() () { cout << "my name is \" A operator\"" << endl; } }; int main() { A a; thread t(a);//以一个类对象为入口函数,需要重载"()"并且没有参数 return 0; }
3).用类中的函数成员作为入口函数
class A { public: void fun() { cout << "fun" << endl; } }; int main() { A a; thread t(&A::fun,&a);//我们构造函数的参数1需要函数的地址,参数2为哪个对象的地址 system("pause>0"); return 0; }
使用
说了这么多,没有给我们看到效果啊,别急下面就是使用(有坑):
1).join函数
作用:主线程等待子线程执行完后再执行主线程,阻塞的。
class A { public: void fun() { cout << "fun" << endl; } }; int main() { A a; thread t(&A::fun,&a); t.join();//启动子线程 return 0; }
2).detach函数
作用:主线程和子线程一起执行,当主线程没了,子线程就会交给系统管理了,就失去了我们的控制
class A { public: void fun() { cout << "fun" << endl; } }; int main() { A a; thread t(&A::fun,&a); t.detach(); return 0; }
3).joinable函数
作用:判断是否可以join/detach true为可以,false为不可以
class A { public: void fun() { cout << "fun" << endl; } }; int main() { A a; thread t(&A::fun,&a); if(t.joinable()) { cout<<"t 未join/detach"<<endl; } return 0; }
detach大坑以及一些其他函数
1.传递字符串指针时,我们可以使用容器:const string,原因:
因为我们不知道主线程执行完后,子线程是否在执行,如果主线程没了,内存被回收了,完了:指针指向的东西变不可控了,所以传他
2.参数也不能有引用(detach情况下):和(1)原因基本一样:
如果真的想传引用,使用函数:std::ref();
3.传递类时,尽量构造临时对象进行传递
其他函数:std::this_thread();
查看此线程的id
智能指针的传递
创建:unique_ptr<类型>(指向的变量)
创建他时需要使用std::move()
移动语义函数
入口参数也需要遵守上面讲参数的一些规则