【C++】多线程的学习笔记——白话文版(bushi

目录

为什么要使用多线程

例子

代码

结果

首先要先学的库——thread库

thread的简介

thread的具体使用方法

基本变量的定义

注意(小重点)

join函数的解读(重点)

detach函数的解读

注意

关于vector和thread是联合使用

例子中代码的改良

代码

运行结果

总结

是不是少了什么?


为什么要使用多线程

在我们实际处理问题中可能会遇到一些需要等待或者是需要时间去等待放回的问题

比如像网络爬虫的数据包返回,亦或者程序对cpu的使用率不高,导致时间和性能的浪费

同时多线程可以实现异步编程,将一些耗时的操作放在后台线程执行,使得主线程能够继续响应用户的其他操作,提高程序的并发性。

综上所述,多线程编程对于我们大部分编程语言的学习都是必须要学习的。

例子

在这里我先放一个源代码在这,这是我们用原先的方法进行顺序执行

代码

#include <iostream>
#include <thread>
#include <time.h>
using namespace std;
void F_1(int i) {this_thread::sleep_for(chrono::seconds(i));//设定程序需要运行的时间cout << "The No."<<i<<" is finish" << endl;
}
int main() {clock_t now_time_1 = clock();//记录刚刚开始的时间cout << "This project is start!" << endl;for (int i = 1; i <= 3; i++) {F_1(i);}cout << "This project is ready!" << endl;clock_t now_time_2 = clock();//记录最后结束的时间cout << "The cost time is " << now_time_2 - now_time_1 <<" ms " << endl;
}

 其中time.h库中的clock_t以及clock()是是用来统计程序运行的时间的

this_thread::sleep_for(chrono::seconds(i))这个函数是个休眠函数,为等待i秒,用来模拟程序运行的时间

结果

程序运行的结果

如图程序一共运行了6000ms的时间 

首先要先学的库——thread库

thread的简介

C++ 作为一种强大的编程语言,为多线程编程提供了丰富而灵活的支持。C++ 的标准库提供了 <thread> 头文件,其中包含了用于创建、启动和管理线程的类和函数。通过使用这些多线程库和功能,开发人员可以轻松地引入并发性到自己的应用程序中,实现多线程的并行处理。

thread的具体使用方法

基本变量的定义

thread函数中定义线程的语法规如下

std::thread 变量名 (函数,传递的参数1,传递的参数2,传递的参数3...)【如果前面加了using namespace std;可以删除std::】
注意(小重点)

其中如果原函数传递的参数为左值(也就是int &a)那么传递的参数应该把原来的a,b...改为ref(a),ref(b)或者cref(a),cref(b)...

原因是thread为右值传递,函数讲道理应该不能用引用也就是右值。

至于啥是左值啥是右值?

简单来说就是左值是内存上有空间或者是有地址的,而右值就是内存上没空间或者是只有临时地址的,举个例子

int a=1;//a为左值,1为右值
int b=a+1;//b为左值,a+1为右值(注意)
int& c=b;//可以,因为a为左值,在内存上有空间
int& d=10//不可以,因为10为右值,在内存上面没有空间

那为什么ref以及cref可以呢?

  • ref可以包装按引用传递的值为右值。
  • cref可以包装按const引用传递的值为右值。

他们都是经过从左值转为右值的转化的(但是实际还是左值)

join函数的解读(重点)

join函数就是等待副线程完毕才可以进行join()函数下面的部分

join函数看起来是加入,有一些人(包括我)把它看成加入线程池,其实我觉得把它换成wait其实更好一点......,因为join简单来说就是堵塞主线程,一直到函数运行完毕才可以进行下一步

简单来说就是这样一个图

这样看就是很完整了,不然如果是运行join()才加入的话,那样运行时间和上面代码没什么区别......

detach函数的解读

detach函数就是比较简单的

笼统的来说:就是把它和主线程分离,两人谁也不等谁(但是其实主线程结束后,副线程由于守护线程的结束也会停止)

注意

如果你不使用或者是多次使用join或者detach两个中的一个函数,程序都会报错

关于vector和thread是联合使用

代码

vector <thread> sum_1;
sum_1.push_back(thread(F_1, 1));

如上使用就可以了

join函数就可以这样使用

sum_1[0].join();

例子中代码的改良

那么例子中提到的代码就可以进行修改了

代码

#include <iostream>
#include <thread>
#include <time.h>
#include <vector>
using namespace std;
void F_1(int i) {this_thread::sleep_for(chrono::seconds(i));//设定程序需要运行的时间cout << "The No."<<i<<" is finish" << endl;i++;
}
int main() {clock_t now_time_1 = clock();cout << "This project is start!" << endl;//记录刚刚开始的时间vector <thread> sum_1;for (int i = 1; i <= 3; i++) {sum_1.push_back(thread(F_1, i));}for (int i = 0; i <= sum_1.size() - 1; i++) {sum_1[i].join();}//for (int i = 1; i <= 3; i++) {//	thread t(F_1, i);//}cout << "This project is ready!" << endl;//记录结束的时间clock_t now_time_2 = clock();cout << "The cost time is " << now_time_2 - now_time_1 <<" ms " << endl;
}

代码中创建的一个容器进行装载三个线程

然后创建过程中已经一起执行了

运行结果

 如图,为3015ms,节约的时间十分的可观

总结

在编程中多线程操作一般可以节约可观的时间,并且可以对自己的程序进行一些优化

尽管现在只学了thread库,但是不要担心

接下来我会按照我的学习路线依次把我的学习笔记给写下来

是不是少了什么?

哦,对了

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

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

相关文章

Mac程序坞美化工具 uBar

uBar是一款为Mac用户设计的任务栏增强软件&#xff0c;它可以为您提供更高效和更个性化的任务管理体验。 以下是uBar的一些主要特点和功能&#xff1a; 更直观的任务管理&#xff1a;uBar改变了Mac上传统的任务栏设计&#xff0c;将所有打开的应用程序以类似于Windows任务栏的方…

学习开发一个RISC-V上的操作系统(汪辰老师) — 环境配置

前言 &#xff08;1&#xff09;此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 &#xff08;2&#xff09;该课程相关代码gitee链接&#xff1b; &#xff08;3&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;4&#xff09;在学习汪辰老…

计算机竞赛 深度学习疲劳检测 驾驶行为检测 - python opencv cnn

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习加…

Guava限流器原理浅析

文章目录 基本知识限流器的类图使用示例 原理解析限流整体流程问题驱动1、限流器创建的时候会初始化令牌吗&#xff1f;2、令牌是如何放到桶里的&#xff1f;3、如果要获取的令牌数大于桶里的令牌数会怎么样4、令牌数量的更新会有并发问题吗 总结 实际工作中难免有限流的场景。…

2023/9/27 -- ARM

【汇编语言相关语法】 1.汇编语言的组成部分 1.伪操作&#xff1a;不参与程序的执行&#xff0c;但是用于告诉编译器程序该怎么编译 .text .global .end .if .else .endif .data2.汇编指令 编译器将一条汇编指令编译成一条机器码&#xff0c;在内存里一条指令占4字节内…

进阶指针(四)—— 加强对指针,数组名,sizeof,strlen的理解

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 &#x1f388;推荐相关博文&#xff1a;进阶C语言&#xff08;一&#xff09;、进阶C语言&#xff08;二&#xff09;、进阶C语言&#xff08;三&#xff09; 进阶指针&#xff08;四&#x…

QT:绘图

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> //绘图事件class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent 0);~Widget();void paintEvent(QPaintEvent *event); //重写绘图事件void timerEve…

GD32F10X ----RTC

1. RTC的简介 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置…

格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断(Python代码,CNN模型)

1.运行效果&#xff1a;格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断&#xff08;Python代码&#xff0c;CNN模型&#xff09;_哔哩哔哩_bilibili 环境库 只要tensorflow版本大于等于2.4.0即可运行 2.GAF的内容 GAF是一种用于时间序列数据可视化和特征提…

LLM-TAP随笔——大语言模型基础【深度学习】【PyTorch】【LLM】

文章目录 2.大语言模型基础2.1、编码器和解码器架构2.2、注意力机制2.2.1、注意力机制&#xff08;Attention&#xff09;2.2.2、自注意力机制&#xff08;Self-attention&#xff09;2.2.3、多头自注意力&#xff08;Multi-headed Self-attention&#xff09; 2.3、transforme…

【C++】笔试训练(三)

目录 一、选择题二、编程题1、字符串中找出连续最长的数字串2、数组中出现次数超过一半的数字 一、选择题 1、以下程序的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {char a[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, * p;int i;i 8;p a i;p…

【JVM】双亲委派模型

双亲委派模型 1. 什么是双亲委派模型2. 双亲委派模型的优点 1. 什么是双亲委派模型 提到 类加载 机制&#xff0c;不得不提的一个概念就是“双亲委派模型”。 双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程 类加载器: JVM 里面专门提供…

【ESP32 + Edge Impulse平台】运行AI算法模拟多传感器数据融合实现异常检测

本篇博文主要以ESP32+MQ Sensor 气体传感器为例,通过连接 Edge Impulse 平台,实现数据的实时采集和训练,进而实现在嵌入式设备上部署 ML 机器学习。本教程介绍如何使用 Edge Impulse 和机器学习来实现ESP32 异常检测系统,系统使用一个机器学习模型,检测气体何时出现异常。…

OpenCV查找和绘制轮廓:findContours和drawContours

1 任务描述&#xff1a; 绘制图中粗线矩形的2个边界&#xff0c;并找到其边界的中心线 图1 原始图像 2.函数原型 findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, …

2021-06-11 51蛋骗鸡用小数点作秒指示,分钟计时.(怎么用二个数码管做分的倒计时,DP亮灭来计秒)

缘由怎么用二个数码管做分的倒计时&#xff0c;DP亮灭来计秒,求思路 - 24小时必答区 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit BUZ1P1^0; bit k0; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128};//0-9. unsign…

Polygon Miden:扩展以太坊功能集的ZK-optimized rollup

1. 引言 Polygon Miden定位为zkVM&#xff0c;定于2023年Q4上公开测试网。 zk、zkVM、zkEVM及其未来中指出&#xff0c;当前主要有3种类型的zkVM&#xff0c;括号内为其相应的指令集&#xff1a; mainstream&#xff08;WASM, RISC-V&#xff09;EVM&#xff08;EVM bytecod…

Kubernetes 学习总结(38)—— Kubernetes 与云原生的联系

一、什么是云原生&#xff1f; 伴随着云计算的浪潮&#xff0c;云原生概念也应运而生&#xff0c;而且火得一塌糊涂&#xff0c;大家经常说云原生&#xff0c;却很少有人告诉你到底什么是云原生&#xff0c;云原生可以理解为“云”“原生”&#xff0c;Cloud 可以理解为应用程…

[NOIP2011 提高组] 选择客栈

[NOIP2011 提高组] 选择客栈 题目描述 丽江河边有 n n n 家很有特色的客栈&#xff0c;客栈按照其位置顺序从 1 1 1 到 n n n 编号。每家客栈都按照某一种色调进行装饰&#xff08;总共 k k k 种&#xff0c;用整数 0 ∼ k − 1 0 \sim k-1 0∼k−1 表示&#xff09;&am…

机器学习——seaborn实用画图方法简介

0、seaborn简介: 前言:下面的总结只是介绍seaborn有哪些方法和属性,至于具体使用,通过下面给出的名称稍作查找即可。重点应该关注本文介绍的seaborn的使用方法seaborn与机器学习的关系: 知识图谱 0.1、了解即可的知识: seaborn:在matplotlib的基础上画一些更好看的图,在…

Mysql集群高可用架构MHA

Mysql集群高可用架构MHA 一、MHA概述1.1、 MHA 是什么1.2、 MHA 的组成1.3、 MHA 的特点 二、MHA高可用实例2.1、配置主从复制2.1、 安装 MHA 软件2.2、故障模拟2.3、故障修复 一、MHA概述 1.1、 MHA 是什么 MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的M…