深入理解C++多线程系列——线程基础

概念

在现代计算机中,多线程编程是一种强大的并发执行计数,允许多个线程在单个程序内部并行执行,提高程序的执行效率和响应速度。
线程,作为CPU调度的最小单元,它被用来执行程序中的指令。一个线程是进程中的一个单一顺序控制流程,多线程则允许一个进程内有多个这样的控制流程同时运行。
多线程可以看做一种特殊的多任务处理方式,只不过这些“任务”是在同一个进程的上下文中并发运行的。这使得线程间可以共享进程资源,如内存数据、文件资源,而不需要额外的进程间通信机制。

程序本身是静态的,存储在某种媒介上,比如硬盘或光盘。当操作系统运行程序时,会创建一个进程,该进程会将程序的代码和其数据加载到内存中,以供CPU执行。

CPU

CPU(Central Processing Unit,中央处理器)是计算机的核心硬件之一,负责解释和执行大部分的命令。它从基本构造上包括算数逻辑单元、控制单元、寄存器、缓存和总线。

CPU组成部分介绍

  • 算数逻辑单元(ALU)

ALU是CPU的计算核心,负责执行所有的算数运算(如加减乘除)和逻辑运算(如比较大小、与、或、非等)。ALU根据控制单元发来的指令进行相应的数据处理。

  • 控制单元(CU)

控制单元负责从内存中取出指令,解析并执行它们。它控制CPU内部和CPU与其他计算机组件之间的数据流动,确保各个部件协调一致。

  • 寄存器

寄存器是CPU内部非常小但速度极快的存储设备。它们用于暂存指令、数据和地址等信息。寄存器的使用极大地提高了CPU的处理速度和效率。

  • 缓存

缓存是位于CPU和主内存之间的小容量高速存储区域,用于暂存CPU经常访问的数据和指令。通过缓存,CPU可以快速获取需要的信息,而不必每次都去较慢的内存中读取,从而加速处理过程。

  • 总线

总线是连接CPU内部各部分以及CPU与其他计算机组件的通道。包括数据总线、地址总线和控制总线,分别用于数据传输、地址传输和控制信号传输。

CPU处理流程

以前CPU都是单核的,同一时间只能处理单个指令;而现代的CPU都是多核的,同一时间能够处理多个指令。
单核CPU下处理多任务的流程
未命名文件 (3).png
双核CPU下处理多任务的流程
未命名文件 (2).png

线程

进程作为系统分配资源的最小单元,由至少一个线程组成,由多个线程组成的叫多线程程序。

线程和进程最大的区别是进程之间不共享内存。

为什么要使用多线程?

在Windows操作系统下运行计算器程序,这个程序有以下任务需要处理:

  • UI渲染(重绘事件)
  • 响应鼠标事件
  • 响应按键事件
  • 数据计算

如果这个程序是一个单线程程序,那么它的具体流程如下:

未命名文件 (5).png传统的GUI程序通常不需要开发者显式创建单独的线程来等待和响应鼠标和键盘事件,通常由UI线程自动处理。
UI线程的主体就是一个事件循环,该循环就是处理事件队列中的事件。事件队列维护了所有和UI相关的事件,比如用户输入事件(鼠标事件、键盘事件)、界面控制事件(窗口事件(调整大小事件、移动窗口事件、关闭窗口事件等)、控件事件(按钮点击事件、文本框输入事件等))等等。

从上图中可以看到一个线程就是一直在处理一个循环,在这个循环中处理各种事件。其中,鼠标事件和键盘事件都可能触发数据计算的任务,数据计算成功后,再响应重绘事件,将结果更新到UI上。

这样会有什么问题呢?

假设数据计算这个任务耗时2秒,那么整个循环中的其他事件就只能在2秒后才能响应了。在这2秒时间内,UI无法重绘导致“界面冻结”,用户无法输入数据。

怎么解决呢?

在传统的GUI程序开发中,我们往往会为一些耗时的数据处理创建新的线程,所有耗时的任务都在这个新的线程中执行。

在C++中创建线程

以前的C++标准库并没有线程接口,都是由各自的平台自己实现的。比如在Windows下是通过CreateThread来创建线程的,在Linux下是通过pthread_create来创建线程的。
从C++11开始,标准库正式引入了线程std::thread,下面我们通过标准库的std::thread来写一个多线程程序:

#include <iostream>
#include <thread>

using std::thread;

void thd1_fun() {
	for (int i = 0; i < 10; ++i) {
		std::cout << "线程1正在运行!\n";
	}
}

void thd2_fun() {
	for (int i = 0; i < 10; ++i) {
		std::cout << "线程2正在运行!\n";
	}
}

void thd3_fun() {
	for (int i = 0; i < 10; ++i) {
		std::cout << "线程3正在运行!\n";
	}
}

int main() {
	thread t1(thd1_fun);
	thread t2(thd2_fun);
	thread t3(thd3_fun);

	t1.join();
	t2.join();
	t3.join();
	return 0;
}

运行结果如下:

线程1正在运行!
线程1正在运行!
线程1正在运行!
线程1正在运行!
线程1正在运行!
线程1正在运行!
线程1正在运行!
线程1正在运行!
线程1正在运行!
线程1正在运行!
线程3正在运行!
线程3正在运行!
线程2正在运行!
线程2正在运行!
线程2正在运行!
线程2正在运行!
线程2正在运行!
线程2正在运行!
线程2正在运行!
线程2正在运行!
线程2正在运行!
线程2正在运行!
线程3正在运行!
线程3正在运行!
线程3正在运行!
线程3正在运行!
线程3正在运行!
线程3正在运行!
线程3正在运行!
线程3正在运行!

因为三个函数在不同的线程中运行,所以每次运行结果中的输出顺序是可能不一样的。

后面我们再详细介绍C++多线程编程,未完待续… …

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商测评自养号需要解决哪些问题?

现在做测评工作室这块的&#xff0c;真正有技术的每天单都做不过来&#xff0c;同样也滋生出很多找别人买个设备和账号就以为自己懂了&#xff0c;直接开始教学来割韭菜&#xff0c;很多人没接触过这行业&#xff0c;不知道里面的水很深&#xff0c;花了钱&#xff0c;却没有掌…

移动端 UI 风格,魅力无限

移动端 UI 风格&#xff0c;打造极致体验

在推荐四款软件卸载工具,让流氓软件无处遁形

Revo Uninstaller Revo Uninstaller是一款电脑软件、浏览器插件卸载软件&#xff0c;目前已经有了17年的历史了。可以扫描所有window用户卸载软件后的残留物&#xff0c;并及时清理&#xff0c;避免占用电脑空间。 Revo Uninstaller可以通过命令行卸载软件&#xff0c;可以快速…

ChatGPT-4o独家揭秘:全国一卷高考语文作文如何轻松斩获满分?

​一、2024年全国一卷高考 二、2018年全国一卷高考 三、2016年全国一卷高考 一、2024年全国一卷高考 技术进步的悖论&#xff1a;我们的问题真的在减少吗&#xff1f; 引言 随着互联网的普及和人工智能的应用&#xff0c;越来越多的问题能够快速得到解答。然而&#xff0c;这引…

msvcr120.dll丢失怎样修复?为什么msvcr120.dll文件很重要

msvcr120.dll​ 是一个属于 Microsoft Visual C 2013 Redistributable package 的动态链接库文件。这个文件对于运行使用 Visual Studio 2013 开发的应用程序是必要的&#xff0c;因为它包含了C运行时库的一部分功能&#xff0c;这些功能是标准C库中与输入/输出操作、字符串操作…

Redis客户端界面工具QuickRedis

介绍 QuickRedis 是一款 永久免费 的 Redis 可视化管理工具。它支持直连、哨兵、集群模式&#xff0c;支持亿万数量级的 key&#xff0c;还有令人兴奋的 UI。QuickRedis 支持 Windows 、 Mac OS X 和 Linux 下运行。 QuickRedis 是一个效率工具&#xff0c;当别人在努力敲命令…

RK3588+FPGA+算能BM1684X:高性能AI边缘计算盒子,应用于视频分析、图像视觉等

搭载RK3588&#xff08;四核 A76四核 A55&#xff09;&#xff0c;CPU主频高达 2.4GHz &#xff0c;提供1MB L2 Cache 和 3MB L3 &#xff0c;Cache提供更强的 CPU运算能力&#xff0c;具备6T AI算力&#xff0c;可扩展至38T算力。 产品规格 系统主控CPURK3588&#xff0c;四核…

torch.cat 与 torch.concat函数

文章目录 区别torch.cat介绍作用参数使用实例关于参数dim为None的使用 区别 先说结论&#xff1a;没有区别在功能、用法以及作用上&#xff0c;concat函数就是cat函数的别名&#xff08;官方就是这样说的&#xff09;。下面截图为证&#xff1a;   因此接下来就主要是介绍 to…

苹果手机618大降价重登销量榜首 红米K70pro为何成京东618国产手机之光

今天的618已经好几天了&#xff0c;很多买有机的已经下单&#xff0c;不出意外苹果15系列手机仍然是最卖座的手机&#xff0c;大家虽然口号喊得很响身体却是诚实的。但令人感到意外的是&#xff0c;今年618国产手机的第一把交椅确实红米K70系列&#xff0c;说好的支持华为呢&am…

哈夫曼树的创建

要了解哈夫曼树&#xff0c;可以先了解一下哈夫曼编码&#xff0c;假设我们有几个字母&#xff0c;他们的出现频率是A: 1 B: 2 C: 3 D: 4 E: 5 F: 6 G: 7。那么如果想要压缩数据的同时让访问更加快捷&#xff0c;就要让频率高的字母离根节点比较进&#xff0c;容易访问&#xf…

el-input中change事件造成的坑

el-input中change事件造成的坑 一、change事件定义二、如果仅回车时候触发 一、change事件定义 仅在输入框失去焦点或用户按下回车时触发 二、如果仅回车时候触发 <el-inputv-model.trim"questionInput"placeholder"请输入你的问题&#xff0c;按回车发送&…

vue-$set修改深层对象的值

背景&#xff1a; 点击编辑按钮&#xff0c;打开修改预算的抽屉&#xff0c;保存后更新此行数据的预算&#xff0c;以前是调接口刷新表格&#xff0c;这次的数据是由前端处理更新&#xff0c;由于数据层级比较深&#xff0c;使用$set来修改两层嵌套对象 使用方法&#xff1a; …

python - DataFrame查询数据操作

学习目标 掌握获取df一列或多列数据的方法 知道loc和iloc的区别以及使用方法 知道df的query函数的使用方法 知道isin函数的作用和使用方法 获取DataFrame子集的基本方法 1.1 从前从后获取多行数据 案例中用到的数据集在文章顶部 LJdata.csv 前景回顾 head() & tail(…

opencv实战小结-银行卡号识别

实战1-银行卡号识别 项目来源&#xff1a;opencv入门 项目目的&#xff1a;识别传入的银行卡照片中的卡号 难点&#xff1a;银行卡上会有一些干扰项&#xff0c;如何排除这些干扰项&#xff0c;并且打印正确的号码是一个问题 最终效果如上图 实现这样的功能需要以下几个步骤…

JDK7 JDK8 JDK9接口中的默认方法、静态方法、私有方法

JDK8开始之后接口新增的方法 JDK7以前&#xff1a;接口中只能定义抽象方法 JDK8的新特性&#xff1a;接口中可以定义有方法体的方法&#xff08;默认、静态&#xff09; JDK9的新特性&#xff1a;接口中可以定义私有方法 接口中的默认方法InterA package com.itheima.a06;p…

IO进程线程(十)进程间通信 消息队列 共享内存 信号灯集

文章目录 一、IPC(Inter-Process Communication)进程间通信相关命令 &#xff1a;&#xff08;一&#xff09;ipcs --- 查看IPC对象&#xff08;二&#xff09;获取IPC键值&#xff08;三&#xff09;删除IPC对象的命令&#xff08;四&#xff09;获取IPC键值的函数1. 函数定义…

C++基础与深度解析 | 模板 | 函数模板 | 类模板与成员函数模板 | concepts | 完美转发 | 模板的其他内容

文章目录 一、函数模板二、类模板与成员函数模板三、Concepts(C20)四、模板相关内容1.数值模板参数与模板模板参数2.别名模板与变长模板3.包展开与折叠表达式4.完美转发与lambda表达式模板5.消除歧义与变量模板 一、函数模板 在C中&#xff0c;函数模板是一种允许你编写可以处理…

在Windows上安装VMWare Pro 16.2(虚拟机)并从零安装CentOS 7.6镜像过程记录

本文详细记录了在Windows的VMWare Workstation Pro 16.2中安装CentOS 7.6 的过程,非常适合新手从零开始一步步安装。 文章目录 一、安装VMWare Workstation Pro 16.2并激活二、安装CentOS 7.62.1 下载CentOS7.6镜像文件2.2 创建新的虚拟机2.3 安装CentOS镜像一、安装VMWare Wo…

國際知名榮譽顧問加入台灣分析集團總部,全面升級量子電腦Q系統

近期,國際知名的榮譽顧問正式加入台灣分析集團總部,利用相同的量子數據規格訊息數據庫,進行全方位的系統升級。此次升級後,量子電腦Q系統的精確預測和迅速反應能力提升了3.29%。透過高級的數據處理和技術分析,社群用戶將在瞬息萬變的市場中保持領先地位。 “量子電腦Q系統”由資…

C语言字符、数组指针变量

目录 一、字符指针变量 二、数组指针变量 a.数组指针变量是什么 b.数组指针变量的书写格式 c.数组指针变量如何初始化 d.二维数组传参的本质 一、字符指针变量 在指针的类型中我们知道有一种指针类型为字符指针 char* 。 其一般使用&#xff1a; int main() {char ch w…