C++11并发与多线程笔记(2)

C++11并发与多线程笔记(2) 线程启动、结束,创建线程多法、join,detach

  • 1. 范例演示线程运行的开始
    • 1.1 创建一个线程:
    • 1.2 join
    • 1.3 datch
    • 1.4 joinable
  • 2. 其他创建线程的方法
    • 2.1 用类 重载了函数调用运算符
    • 2.2 lambda表达式创建线程

1. 范例演示线程运行的开始

  • 程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;当主线程从main()函数返回,则整个进程执行完毕
  • 主线程从**main()开始执行,**那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,线程也结束运行
  • 整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时如果其他子线程还没有执行完,也会被强行终止【此条有例外,以后会解释】

1.1 创建一个线程:

  1. 包含头文件thread
  2. 写初始函数
  3. 在main中创建thread
    必须要明白:有两个线程在跑,相当于整个程序中有两条线在同时走,即使一条被阻塞,另一条也能运行
#include <iostream>
#include <thread>
using namespace std;void myPrint()
{cout << "我的线程开始运行" << endl;//-------------//-------------cout << "我的线程运行完毕" << endl;return;
}int main()
{//(1)创建了线程,线程执行起点(入口)是myPrint;(2)执行线程thread myThread(myPrint);//(2)阻塞主线程并等待myPrint执行完,当myPrint执行完毕,join()就执行完毕,主线程继续往下执行//join意为汇合,子线程和主线程回合myThread.join();//设置断点可看到主线程等待子线程的过程//F11逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面//F10逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行//(3)传统多线程程序中,主线程要等待子线程执行完毕,然后自己才能向下执行//detach:分离,主线程不再与子线程汇合,不再等待子线程//detach后,子线程和主线程失去关联,驻留在后台,由C++运行时库接管//myThread.detach();//(4)joinable()判断是否可以成功使用join()或者detach()//如果返回true,证明可以调用join()或者detach()//如果返回false,证明调用过join()或者detach(),join()和detach()都不能再调用了if (myThread.joinable()){cout << "可以调用可以调用join()或者detach()" << endl;}else{cout << "不能调用可以调用join()或者detach()" << endl;}cout << "Hello World!" << endl;return 0;
}

1.2 join

join意为汇合,子线程和主线程回合

1.3 datch

detach:分离,主线程不再与子线程汇合,不再等待子线程
detach和join只能

1.4 joinable

joinable(): 判断是否可以成功使用join()或者detach()。
如果返回true,证明可以调用join()或者detach()
如果返回false,证明调用过join()或者detach()

重要补充:
线程类参数是一个可调用对象
一组可执行的语句称为可调用对象,c++中的可调用对象可以是函数函数指针lambda表达式bind创建的对象或者重载了函数调用运算符的类对象。

2. 其他创建线程的方法

2.1 用类 重载了函数调用运算符

创建一个类,并编写圆括号重载函数,初始化一个该类的对象,把该对象作为线程入口地址

class Ta
{
public:void operator()() //不能带参数{cout << "我的线程开始运行" << endl;//-------------//-------------cout << "我的线程运行完毕" << endl;}
};//main函数里的:
int main(){Ta ta;thread mytobj1(ta);//子进程mytobj1从ta开始执行mytobj1.join(); //等待子进程执行结束cout<<"I love China"<<endl;return 0;
}

问题案例(避免):

class TA{
public:int &m_i;//引用TA(int &i):m_i(i){}void operator() (){//不带参数cout<<"m_i1的值为:"<<m_i<<endl;cout<<"m_i2的值为:"<<m_i<<endl;cout<<"m_i3的值为:"<<m_i<<endl;cout<<"m_i4的值为:"<<m_i<<endl;cout<<"m_i5的值为:"<<m_i<<endl;cout<<"m_i6的值为:"<<m_i<<endl;cout<<"m_i7的值为:"<<m_i<<endl;cout<<"m_i8的值为:"<<m_i<<endl;
}
int main(){int myi=6;TA ta(myi);thread mytobj2(ta);//ta:可调用对象mytobj2.detach();}

结果:

在这里插入图片描述
分析:传入子线程的是引用,使用detach后,主线程提前结束,释放myi,子线程的值就会无效。

  • 一旦调用了detach(),那我主线程执行结束了,我这里用的这个ta这个对象还在吗?〈对象不在)

  • 这个对象实际上是被复制到线程中去(调用拷贝构造函数) ﹔执行完主球程后,ta会被销毁,但是所复制的TA对象依旧存在。

  • 所以,只要你这个TA类对象里没有引用,没有指针,那么就不会产生问题;

2.2 lambda表达式创建线程

int main(){auto mylamthrea=[]{cout << "我的线程开始运行" << endl;//-------------//-------------cout << "我的线程运行完毕" << endl;};thread myobj4(mylamthrea);myobj4.join();cout << "Hello World!" << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis数据结构——Redis简单动态字符串SDS

定义 众所周知&#xff0c;Redis是由C语言写的。 对于字符串类型的数据存储&#xff0c;Redis并没有直接使用C语言中的字符串。 而是自己构建了一个结构体&#xff0c;叫做“简单动态字符串”&#xff0c;简称SDS&#xff0c;比C语言中的字符串更加灵活。 SDS的结构体是这样的…

Python-OpenCV中的图像处理-视频分析

Python-OpenCV中的图像处理-视频分析 视频分析Meanshift算法Camshift算法光流 视频分析 学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象: Meanshift算法 Meanshift 算法的基本原理是和很简单的。假设我们有一堆点&#xff08;比如直方 图反向投影得到的点&…

ASR 语音识别接口封装和分析

这个文档主要是介绍一下我自己封装了 6 家厂商的短语音识别和实时流语音识别接口的一个包&#xff0c;以及对这些接口的一个对比。分别是&#xff0c;阿里&#xff0c;快商通&#xff0c;百度&#xff0c;腾讯&#xff0c;科大&#xff0c;字节。 zxmfke/asrfactory (github.c…

ubuntu 安装 cuda

ubuntu 安装 cuda 初环境与设备在官网找安装方式 本篇文章将介绍ubuntu 安装 CUDA Toolkit CUDA Toolkit 是由 NVIDIA&#xff08;英伟达&#xff09;公司开发的一个软件工具包&#xff0c;用于支持并优化 GPU&#xff08;图形处理器&#xff09;上的并行计算和高性能计算。它…

解析TCP/IP协议的分层模型

了解ISO模型&#xff1a;构建通信的蓝图 为了促进网络应用的普及&#xff0c;国际标准化组织&#xff08;ISO&#xff09;引入了开放式系统互联&#xff08;Open System Interconnect&#xff0c;OSI&#xff09;模型。这个模型包括了七个层次&#xff0c;从底层的物理连接到顶…

一、Dubbo 简介与架构

一、Dubbo 简介与架构 1.1 应用架构演进过程 单体应用&#xff1a;JEE、MVC分布式应用&#xff1a;SOA、微服务化 1.2 Dubbo 简介一种分布式 RPC 框架&#xff0c;对专业知识&#xff08;序列化/反序列化、网络、多线程、设计模式、性能优化等&#xff09;进行了更高层的抽象和…

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球

目录 SceneView类的常用属性SceneView类的常用方法vue3中使用SceneView类创建三维地球项目准备引入ArcGIS API创建Vue组件在OnMounted中调用初始化函数initArcGisMap创建Camera对象Camera的常用属性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加载和展示三维地…

Java旋转数组中的最小数字(图文详解版)

目录 1.题目描述 2.题解 分析 具体实现 方法一&#xff08;遍历&#xff09;&#xff1a; 方法二&#xff08;排序&#xff09;&#xff1a; 方法三&#xff08;二分查找&#xff09;&#xff1a; 1.题目描述 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]&a…

npm install 中 --save 和 --save-dev 是什么?

npm&#xff0c;全名 Node Package Manager&#xff0c;套件管理工具&#xff0c;package.json 会记下你在项目中安装的所有套件。 假设在项目中安装 lodash npm i --save lodash这样在 dependencies 中会出现&#xff1a; 如果修改了导入方式&#xff1a; npm i --save-dev …

Labview解决“重置VI:xxx.vi”报错问题

文章目录 前言一、程序框图二、前面板三、问题描述四、解决办法 前言 在程序关闭前面板的时候小概率型出现了 重置VI&#xff1a;xxx.vi 这个报错&#xff0c;并且发现此时只能通过任务管理器杀掉 LabVIEW 进程才能退出&#xff0c;这里介绍一下解决方法。 一、程序框图 程序…

pve7.2虚拟机 lvm磁盘扩容,增加硬盘操作

之前安装pve时候只有256的ssd,最近安装的虚拟机较多&#xff0c;给加块闲置硬盘&#xff0c;顺便学习一下&#xff0c;像pve这种虚拟机系统&#xff0c;硬盘应该可以像nas你这样随时增加&#xff0c;而不影响上层应用&#xff0c;我自己也是摸索着做。 一、安装好硬盘后打开pv…

vue3+ts-tsconfig.json报错Option ‘importsNotUsedAsValues’

vue3ts-tsconfig.json报错Option ‘importsNotUsedAsValues’ is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption ‘“ignoreDeprecations”: “5.0”’ to silence this error. Use ‘verbatimModuleSyntax’ instead 自我记录 翻译 选项…

echart 3d立体颜色渐变柱状图

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 根据业务需求将不同的法律法规&#xff0c;展示不同的3d立体渐变柱状图。 2.先看下效果图 3. 确定三面的颜色&#xff0c;这里我是自定义的颜色 // 右面生成颜色const rightColorArr ref(["#79D…

ComponentOne Studio ASP.NET MVC Crack

ComponentOne Studio ASP.NET MVC Crack FlexReport增强功能 添加了对在Microsoft Windows上部署Microsoft Azure的支持。 添加了对显示嵌入字体的支持。 .NET标准版的经典C1PDF(Beta版) GrapeCity的经典C1Pdf库现在提供了基于Microsoft.NET标准的版本。在任何.NET应用程序(包括…

江南大学计算机考研分析

24计算机考研|上岸指南 江南大学 江南大学计算机考研招生学院是人工智能与计算机学院。目前均已出拟录取名单。 江南大学人工智能与计算机学院成立于2020年3月&#xff0c;办学历史可追溯到1994年设立的计算机应用专业。学院秉持江南大学“彰显轻工特色&#xff0c;服务国计民…

【数据结构】栈和队列

【数据结构】栈和队列 一&#xff1a; 栈1.栈的概念及和结构2. 栈的实用3. 栈接口实现 二&#xff1a; 队列1. 队列的概念和结构2. 队列的实用3. 队列接口实现 三&#xff1a;扩展 一&#xff1a; 栈 1.栈的概念及和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许…

SAP安全库存-安全库存共享、安全库存简介

SAP系统中的安全库存用于管理计划外和计划内的库存需求,在某些行业中,由于不同的情况,如意外损耗、损坏、环境问题、制造工艺问题、需求增加等,通常会出现意外的库存需求。 SAP提供了维护安全库存的处理方式来处理这样的问题,安全库存的字段信息在主数据视图中,在物料需…

题解 | #1002.Shortest path# 2023杭电暑期多校9

1002.Shortest path 签到题 记忆化搜索 题目大意 给定一个正整数 n n n &#xff0c;可以对其进行以下操作&#xff1a; 如果 n n n 能被 3 3 3 整除&#xff0c;则可以使 n n / 3 nn/3 nn/3 ;如果 n n n 能被 2 2 2 整除&#xff0c;则可以使 n n / 2 nn/2 nn/2 …

【C++】deque容器

0.前言 1.deque构造函数 #include <iostream> using namespace std; #include <deque>//deque构造函数 void printDeque(const deque<int>& d) {for (deque<int>::const_iterator it d.begin(); it ! d.end(); it){//*it 100; //加了const就不能…

go的gin和gorm框架实现切换身份的接口

使用go的gin和gorm框架实现切换身份的接口&#xff0c;接收前端发送的JSON对象&#xff0c;查询数据库并更新&#xff0c;返回前端信息 接收前端发来的JSON对象&#xff0c;包含由openid和登陆状态组成的一个string和要切换的身份码int型 后端接收后判断要切换的身份是否低于该…