【C++11】多线程-----创建与使用线程
@TOC
前言
本节课我们奖的是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()
移动语义函数
入口参数也需要遵守上面讲参数的一些规则
- 点赞
- 收藏
- 关注作者
评论(0)