C++多线程基础学习笔记(二)
2024-09-03 20:22:58
先总结延申以下前面(一)所讲的内容。
主线程从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 ;
}
最新文章
- PetaPoco 批量插入数据
- Perl 模块 Getopt::Std 和 Getopt::Long
- View绘制详解,从LayoutInflater谈起
- 客户调用COM流程
- LESS使用方法简介(装逼神器)
- for xml path 如何将字段转换为xml的属性
- Python使用PyMysql操作数据库
- 基于Oracle ADF的应用程序开发
- P1427 小鱼念数字
- 工资薪金VS劳务报酬
- HDU 1568 Fibonacci(大数前4位)
- IDEA 入门
- Mysql表类型(存储引擎)的比较
- Python中使用MongoEngine
- LintCode 204: Singleton
- Android获取屏幕大小和设置无标题栏
- Antenna Placement---poj3020(最大匹配)
- 论文分享NO.4(by_xiaojian)
- iOS开发之--搭建本地的SVN服务器
- Mysql 知识点总结
热门文章
- HZOJ 20190719 那一天她离我而去(图论最小环)
- 2019牛客暑期多校训练营(第一场)I dp+线段树
- eclipse打开项目中文件时左侧project explorer同时展开该文件的路径
- Python与开源GIS
- JS基础_对象操作
- js 处理url参数,应用导航分类
- 成功解决gyp verb ensuring that file exists: C:\Python27\python.exe gyp ERR! configure error gyp ERR! sta
- spring Ioc/DI的理解
- zabbix(1)基础知识
- IDEA的version control log为空,该怎么办?