【C++11】多线程-----创建与使用线程
【摘要】 @TOC 前言本节课我们奖的是C++ 11多线程的创建与使用线程我们多线程的意义在哪:充分利用CPU资源、简化编程模式、简化异步事件处理、使GUI更有效率…提示:以下是本篇文章正文内容,下面案例可供参考 创建多线程及lambad表示式的讲解1.头文件:多线程的头文件为:#include <thread> using namespace std;2.怎么创建线程?首先我们要知道,线程就是一可...
@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()
移动语义函数
入口参数也需要遵守上面讲参数的一些规则
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)