C++多线程基础学习笔记(二)
先总结延申以下前面(一)所讲的内容。
主线程从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 ;
}
C++多线程基础学习笔记(二)的更多相关文章
- Java基础学习笔记二十一 多线程
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...
- Java基础学习笔记二十八 管家婆综合项目
本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...
- javascript第二遍基础学习笔记(二)
一.操作符 1.一元操作符: 自加自减(分前置和后置2种):++.-- 区别:前置的先自加或自减,后进行计算:而后置的是先进行计算,后自加或自减(在其会产生负面影响时才能体现区别): ; i++; / ...
- Java基础学习笔记二十二 网络编程
络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则 ...
- Java基础学习笔记二十五 MySQL
MySQL 在dos中操作mysql 连接mysql命令: mysql -uroot -p密码 ,连接OK,会出现mysql> 对数据库的操作 创建一个库 create database 库名 ...
- Java基础学习笔记二十六 JDBC
什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库,J ...
- 使用JSP实现输出(web基础学习笔记二)
Jsp:Java Server Page 服务器端的Java页面,动态网页技术 jsp注释 显式注释:这种注释客户端是允许看见的;<!--html注释--> 隐式注释:这种注释客户端是看不 ...
- C++多线程基础学习笔记(四)
一.创建多个子线程 前面三章讲的例子都是只有一个子线程和主线程,然而实际中有多个子线程.那么下面介绍如何创建多个子线程. #include <iostream> #include < ...
- Java基础学习笔记二 Java基础语法
注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...
随机推荐
- luogu p4141 消失之物(背包dp+容斥原理)
题目传送门 昨天晚上学长讲了这题,说是什么线段树分治,然后觉得不可做,但那还不是正解,然后感觉好像好难的样子. 由于什么鬼畜的分治不会好打,然后想了一下$O(nm)$的做法,想了好长时间觉得这题好像很 ...
- webpack官方文档分析(三):Entry Points详解
1.有很多种方法可以在webpack的配置中定义entry属性,为了解释为什么它对你有用,我们将展现有哪些方法可以配置entry属性. 2.单一条目语法 用法: entry: string|Array ...
- 关于windows 设备驱动重要的事实
1. windows采用设备树描述所有挂在系统总线上的设备,每个设备对应一个节点. 2.每个设备有自己的device object stack/driver stack. 一个物理上的设备对应多个de ...
- SpringMVC——MVC执行流程底层剖析
SpringMVC流程图如上面所示,根据上图,串联一下底层源码: 1.在DispatcherServlet中找到doDisPatch 2.观察方法体,然后找到getHandler方法 3.点进方法,发 ...
- 3.Linux系统文件名字体不同的颜色都代表什么
在Linux中,文件的颜色都是有含义的.其中, Linux中文件名颜色不同,代表文件类型不一样.如下所示: 白色:表示普通文件浅蓝色:表示链接文件: 灰色:表示其他文件: 绿色:表示可执行文件: 红色 ...
- jupyter notebook + MobaXterm Linux端远程部署
$jupyter notebook --generate-config $python In []: from notebook.auth import passwd In []: passwd() ...
- 石川es6课程---6、解构赋值
石川es6课程---6.解构赋值 一.总结 一句话总结: 结构相同一一对应的方式赋值:let [json, arr, num, str] = [{ a: 1, b: 2 }, [1, 2, 3], 8 ...
- Ubuntu14.04升级cmake版本的方法
在Ubuntu14.04用以下命令默认安装的cmake版本为2.8.x,有时我们需要更高版本的cmake,所以需要升级. $ sudo apt-get install cmake 可通过以下命令查询c ...
- VS Code 调试 Golang 出现 Failed to continue: Check the debug console for details
VS Code断点调试Golang时候,弹出提示:Failed to continue: Check the debug console for details 点击Open launch.json, ...
- oc 基本语法 类 静态变量 常量
// // ReViewClass.h // hellowWorld // 本类是oc复习练手类 // Created by hongtao on 2018/3/26. // Copyright © ...