当前位置: 首页 > news >正文

学懂C++(二十二):高级教程——深入理解 C++ 多线程基础理论和概念

       

目录

1、线程与进程

进程

线程

区别与联系

2、并发与并行

并发

并行

3、线程的生命周期

创建(Create)

就绪(Ready)

运行(Running)

等待(Blocked/Waiting)

完成(Terminated)

4、线程调度

调度方式

线程优先级

5、线程调度示例

C++ 标准库

Windows API


 在现代软件开发中,多线程编程是一个非常重要的领域。它允许程序在同一时间内执行多个任务,从而提高程序的效率和响应性。本文将深入探讨 C++ 多线程的基础理论和概念,并通过实例代码更好地理解和掌握这些知识。

1、线程与进程

进程

定义: 进程是一个运行中的程序实例,包括程序代码、数据、进程控制块(PCB)等。

特征: 1、进程拥有独立的内存空间,相互之间不能直接访问内存。

             2、进程间通讯 (IPC) 方法包括管道、消息队列、共享内存等。

开销: 创建、销毁进程和进程间切换的开销较大。

线程

定义: 线程是进程中的一个执行单元,一个进程可以包含多个线程。线程拥有独立的栈和寄存器,但共享进程的堆和全局变量

特征: 线程之间可以直接共享数据,这使得线程间通信更高效,但也带来了数据竞争问题。

开销: 线程的创建、销毁和线程间切换开销较小于进程。

区别与联系

区别: 

      1. 进程有独立的内存空间,线程共享进程的内存空间。

       2. 进程间通讯复杂且开销大,线程间通讯简单但需要注意同步。

联系: 线程是进程的一部分,一个进程至少有一个主线程,多个线程可以并发执行。

2、并发与并行

并发

定义: 在单个处理器上,通过时间片轮转,实现多个任务在同一时间段内交替执行。目的是提高程序的响应性。

应用场景: 服务器处理多个客户端请求,图形界面程序响应用户操作。

并行

定义: 在多处理器或多核系统上,同时执行多个任务。目的是提高程序的执行效率。

应用场景: 计算密集型任务分布到多个核上并行计算,如图像处理、科学计算。

3、线程的生命周期

创建(Create)

通过调用 std::thread 构造函数或 Windows API CreateThread 创建新线程。新线程进入可执行状态。

就绪(Ready)

线程已经准备好执行,等待 CPU 调度。处于就绪队列中。

运行(Running)

线程获得 CPU 时间片开始执行。执行完时间片后进入就绪或等待状态。

等待(Blocked/Waiting)

线程等待某个条件或事件发生,如等待 I/O 操作完成、等待互斥量、条件变量等。等待事件发生后,重新进入就绪状态。

完成(Terminated)

线程的任务执行完毕或被终止。线程退出并释放资源。

4、线程调度

调度方式

  • 先来先服务 (FCFS): 按线程到达顺序调度。
  • 时间片轮转 (Round-Robin): 每个线程分配固定的时间片,时间片用完后切换到下一个线程。
  • 优先级调度: 按线程优先级调度,高优先级线程优先执行。

线程优先级

定义: 每个线程分配一个优先级,优先级高的线程获得更多的 CPU 时间。

设置方法:

  • 使用标准库: C++ 标准库没有直接提供设置线程优先级的接口,可以通过操作系统 API 实现。
  • Windows API: SetThreadPriority 函数设置线程优先级。

线程优先级的影响:

  • 高优先级线程可以优先获得 CPU 时间,低优先级线程可能长时间得不到执行。
  • 不当的优先级设置可能导致优先级反转问题,即低优先级线程持有高优先级线程需要的资源,导致高优先级线程长时间等待。

5、线程调度示例

C++ 标准库

#include <iostream>
#include <thread>// 线程函数
void threadFunction() {std::cout << "Thread is running!" << std::endl;
}int main() {// 创建线程std::thread t(threadFunction);// 等待线程完成t.join();return 0;
}

Windows API

#include <windows.h>
#include <iostream>// 线程函数
DWORD WINAPI ThreadFunction(LPVOID lpParam) {std::cout << "Thread is running!" << std::endl;return 0;
}int main() {// 创建线程HANDLE hThread = CreateThread(NULL,              // 默认安全属性0,                 // 默认堆栈大小ThreadFunction,    // 线程函数NULL,              // 线程函数参数0,                 // 默认创建标志NULL               // 获取线程ID);// 等待线程完成WaitForSingleObject(hThread, INFINITE);// 关闭线程句柄CloseHandle(hThread);return 0;
}

        通过理解和掌握这些基础理论和概念,可以为深入学习和实践 C++ 多线程编程奠定坚实的基础。希望本文能帮助读者更好地理解和应用多线程编程技术。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • RAG私域问答场景超级详细方案(第一期方案)[1]:工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块)
  • 算法基础知识——核函数
  • #java学习笔记(面向对象)----(未完结)
  • 非范型ArrayList和泛型List<T>
  • Service服务在Android中的使用
  • UDP双向通信
  • SQL注入实例(sqli-labs/less-17)
  • CMake,Makefile,CMakeLists.txt的关系和作用
  • 10分钟学会Docker的安装和使用
  • 概述:Dubbo、Nacos、 Zookeeper 等分布式服务协调与治理等技术
  • WUP-CH34X ch34x系列芯片USB转串口通信uniapp插件使用说明
  • leetcode算法刷题记录--7
  • 编程新手必看:彻底理解!与~的取反操作
  • [C++][opencv]基于opencv实现photoshop算法色阶调整
  • 职场英语培训柯桥外语学校学外语学英语到银泰泓畅学校
  • 2017-09-12 前端日报
  • 2017前端实习生面试总结
  • Angular 响应式表单之下拉框
  • AngularJS指令开发(1)——参数详解
  • CentOS7简单部署NFS
  • GraphQL学习过程应该是这样的
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • js正则,这点儿就够用了
  • LintCode 31. partitionArray 数组划分
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python 反序列化安全问题(二)
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Vue官网教程学习过程中值得记录的一些事情
  • Wamp集成环境 添加PHP的新版本
  • 分布式事物理论与实践
  • 关于 Cirru Editor 存储格式
  • 关于extract.autodesk.io的一些说明
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 那些年我们用过的显示性能指标
  • 前端存储 - localStorage
  • 思否第一天
  • 用Python写一份独特的元宵节祝福
  • nb
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # Maven错误Error executing Maven
  • #14vue3生成表单并跳转到外部地址的方式
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (12)Linux 常见的三种进程状态
  • (160)时序收敛--->(10)时序收敛十
  • (Java入门)学生管理系统
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Python第六天)文件处理
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二十三)Flask之高频面试点
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)计算机毕业设计大学生兼职系统
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务