先总结延申以下前面(一)所讲的内容。

主线程从main()函数开始执行,我们创建的线程也需要一个函数作为入口开始执行,所以第一步先初始化函数。

整个进程是否执行完毕的标志是主线程是否执行完毕,一般情况下,如果想要保持子线程的运行状态,那么要主线程保持运行。

本章从两方面介绍创建线程的方法:

一、用函数创建线程:

关键词:thread(类),join() ,detach(),joinable().

join(),阻塞主线程,等待子线程执行完毕后,才到主线程执行。

detach(),分离主线程,主线程和子线程各走各的,所以会出现多次运行会发现,运行结果可能不同,这时候需要考虑一个问题,主线程如果执行完了,子线程还没跑完,这就可能出现一定问题了。

joinable(),判断是否使用了join()或者detach(),是返回false,否返回true。

注意:join()和detach()不能同时使用,这两个函数本来就有互斥的关系。

 #include <iostream>
#include <thread>
void my_thread()
{
for (int i = ; i <= ; i++)
{
cout << "my_thread" << i << endl;
}
}
int main()
{
thread my_threadObj(my_thread); //创建一个子线程,并传入子线程的函数入口my_thread
if (my_threadObj.joinable()) //返回true代表没有使用join()或者detch()
{
my_threadObj.join(); //阻塞主线程,并让主线程等待子线程执行完
}
else
{
return -;
}
//my_threadObj.detach(); //分离主线程,子线程与主线程各自运行,所以每次运行结果可能不同
for (int i = ; i <=; i++)
{
cout << "main_thread" << i << endl;
}
return ;
}

二、其他方法创建线程

1.用类对象

一旦用了detach()将子线程和主线程分离开,那么主线程执行完后,对象ca已经被销毁,但实际上在子线程上的对象并不是ca,而是ca的拷贝对象,它并没有被销毁,还存在与子线程中。

 class CA
{
public:
void operator()()
{
cout << "my_thread1" << endl;
cout << "my_thread2" << endl;
cout << "my_thread3" << endl;
cout << "my_thread4" << endl;
cout << "my_thread5" << endl;
}
CA()
{
cout << "调用构造函数" << endl;
}
CA(const CA&a)
{
cout << "调用拷贝构造函数" << endl;
}
~CA()
{
cout << "调用析构函数" << endl;
}
};
int main()
{
CA ca;
thread my_threadObj(ca); //创建一个子线程,可调用对象为ca
if (my_threadObj.joinable()) //返回true代表没有使用join()或者detch()
{
my_threadObj.join(); //阻塞主线程,并让主线程等待子线程执行完
}
for (int i = ; i <= ; i++)
{
cout << "main_thread" << i << endl;
}
return ;
}

2.用lambda表达式

 int main()
{
auto mylabda_thread = []
{
for (int i = ; i <= ; i++)
{
cout << "mythread" << i << endl;
}
};
thread mythreadObj(mylabda_thread);
mythreadObj.detach();
for (int i = ; i <= ; i++)
{
cout << "main_thread" << i << endl;
}
return ;
}

最新文章

  1. PetaPoco 批量插入数据
  2. Perl 模块 Getopt::Std 和 Getopt::Long
  3. View绘制详解,从LayoutInflater谈起
  4. 客户调用COM流程
  5. LESS使用方法简介(装逼神器)
  6. for xml path 如何将字段转换为xml的属性
  7. Python使用PyMysql操作数据库
  8. 基于Oracle ADF的应用程序开发
  9. P1427 小鱼念数字
  10. 工资薪金VS劳务报酬
  11. HDU 1568 Fibonacci(大数前4位)
  12. IDEA 入门
  13. Mysql表类型(存储引擎)的比较
  14. Python中使用MongoEngine
  15. LintCode 204: Singleton
  16. Android获取屏幕大小和设置无标题栏
  17. Antenna Placement---poj3020(最大匹配)
  18. 论文分享NO.4(by_xiaojian)
  19. iOS开发之--搭建本地的SVN服务器
  20. Mysql 知识点总结

热门文章

  1. HZOJ 20190719 那一天她离我而去(图论最小环)
  2. 2019牛客暑期多校训练营(第一场)I dp+线段树
  3. eclipse打开项目中文件时左侧project explorer同时展开该文件的路径
  4. Python与开源GIS
  5. JS基础_对象操作
  6. js 处理url参数,应用导航分类
  7. 成功解决gyp verb ensuring that file exists: C:\Python27\python.exe gyp ERR! configure error gyp ERR! sta
  8. spring Ioc/DI的理解
  9. zabbix(1)基础知识
  10. IDEA的version control log为空,该怎么办?