6-1 并发基本概念及实现,进程、线程基本概念

一、并发、进程、线程的基本概念和综述

并发,线程,进程的要求必须掌握;

1.1、并发

两个或更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立任务;
以往计算机,单核cpu(中英处理器):某一个时刻只能执行一个任务:由操作系统调度,每秒钟进行多次所谓的“任务切换”。造成并发的假象(不是真正的并发);这种切换(上下文切换)是要有时间开销的,比如操作系统要保存你切换时的各种状态,执行进度等信息,都需要时间,一会切换回来的时候要复原这些信息。

硬件发展,出现了多处理器计算机:用于服务器和高性能计算领域。
台式机:在一块芯片上有多核(多个)CPU:双核,4核,8核,10核。。。
能够实现真正的并行执行多个任务(硬件并发);
在这里插入图片描述
使用并发的原因:主要就是同时可以干多个事,提高性能;

1.2、可执行程序

磁盘上的一个文件,windows下,一个扩展名为.exe的。linux,ls -la, rwxrwxrwx(x执行权限);

1.3、进程:大家已经知道了可执行程序是能够运行。

windows下,双击一个可执行程序来运行。 linux下 ./文件名 ./a;
进程,就是一个可执行程序运行起来了,就叫创建了一个进程;
进程,就是运行起来了的可执行程序;
while(1){}

1.4、线程

a、每个进程(执行起来的可执行程序),都有一个主线程,这个主线程是唯一的,也就是一个进程中只能有一个主线程。
b、当你执行要给可执行程序,产生了一个进程后,这个主线程就随着这个进程默默的启动起来了;
ctrl+f5运行这个程序的时候,实际上是进程的主线程来执行(调用)这个main函数中的代码;
主线程与进程唇齿相依,有你必然有我,有我必然有你,没有我必然没有你;
线程:用来执行代码的;
线程这个东西理解成一条代码的执行通路(道路);
在这里插入图片描述
除了主线程之外,我们可以通过自己写代码来创建其他线程,其他线程走的是别的道路,甚至去不同的地方
我每创建一个新线程,我就可以在同一时刻,多干一个不同的事(多走一条不同的代码执行路径);

多线程(并发)
线程并不是越多越好,每个线程,都需要一个独立的堆栈空间(1M),线程之间的切换要保存很多中间状态;
切换会耗费本该属于程序运行的时间;
在这里插入图片描述
在这里插入图片描述

总结线程:

a、线程是用来执行代码的;
b、把线程这个东西理解成一条代码的执行通路(道路),一个新线程代表一条新的通路。
c、一个进程自动包含一个主线程,主线程随着进程默默的启动并运行,我们可以通过编码来创建多个其他线程(非主线程)但是创建的数量最大都不建议起来200-300个,至于到底多少个合适,大家在实际的项目中可以不断调整和优化,有的时候线程太多效率反正会降低。
d、因为主线程是自动启动的,所以一个进程中最少也有一个线程(主线程)。进程和主线程感觉 是爹和儿子关系。
e、说白了:多线程程序可以同时干多个事,所以运行效率高。但是到底有多高,并不是一个很容易评估的量化的东西。大家仍旧需要在实际编程,实际项目中进行体会和调整优化;

1.5、学习心得

开发多线程程序:实力的体现。一个是商用的必须需求;
线程开发有一定难度 。实际代码更复杂。理解上更难一些,需要一定的学习时间。
C++线程会涉及很多新概念,对于C++道路上的成长特别关键,不要急于求成;
想拿高薪。网络通讯,网络服务器,网络方向。。。多线程是绝对绕不开的必须得学;

二:并发的实现方法

两个或者更多的任务(独立的活动)同时发生(进行)
实现并发的手段:
a、我们通过多个进程实现并发。
b、在单独的进程中,我创建多个线程来实现并发;自己写代码来创建除了主线程之外的其他线程;

2.1、多进程并发

word启动后就是进程。ie浏览器启动后就是个进程。
账号服务器,游戏逻辑服务器。服务器进程之间的通信。
进程之间通信(同一个电脑上:管道,文件,消息队列,共享内存);
不同电脑上:socket通信技术;

2.2、多线程并发:单个进程中,创建了多个线程。

线程:感觉像轻量级的进程。每个线程都有自己独立的运行路径,但是一个进程中的所有线程共享地址空间(共享内存)。
全局变量,指针,引用都可以在线程之间传递,所以:使用多线程开销远远小于多进程。
共享内存带来新问题,数据一致性问题’’;线程A,线程B;

多进程并发和多线程并发虽然可以混合使用,但建议优化考虑多线程技术手段而不是多进程;
在本章中只讲多线程并发开发技术。后续谈到并发,都指的是多线程并发。

2.3、总结

和进程比,线程有如下优点:
1、线程启动速度快,更轻量级;
2、系统资源开销更少,执行速度更快,比如共享内存这种通信方式比任何其他的通信方式都快;
缺点:
1、使用有一定难度,要小心处理数据的一致性问题;

三:C++11新标准线程库

以往:windows:CreateThread(),_beginthread(),beginthreadexe()创建线程
linux:pthread_create()创建线程
临界区,互斥量;
以往多线程代码不能跨平台;
POSIX thread(pthread):跨平台;做一番配置,所以用起来它也不是那么方便。

从C++11新标准,C++语言本身增加了对多线程的支持,意味着可移植性(跨平台),这大大减少开发人员工作量了;

即将讲解C++11新标准多线程的写法。

学习并掌握C++2.0(11+14+17+20)的新特性,学习线程线程池的应用 ---------------------------------------------------给小白学员的3年学习路径及计划技术方面分三块:1.纯开发技术方向2.音视频流媒体专业方向3.项目实战---------------------------------------------------1.纯开发技术方向(1) C++必须要过硬(至少学会10本经典好书)(2) 系统级编程(Windows、Linux),必须特别熟练系统API,灵活运用(3) 框架与工具(Qt、MFC):必须精通其中一种。(4) 架构与设计模式:需要提升一个高度,不再是简单的编码,而是思维模式。(5) 驱动级别(如果有兴趣,可以深入到驱动级:包括Windows、Linux)(6) 最好学习点Java+Html+javascript等WEB技术。2.音视频流媒体专业方向(1) 音视频流媒体基础理论:   必须认真学会,否则看代码就是看天书(2) 编解码方向:精通h.264,h.265(hevc), 包括理论和各个开源库(ffmpeg,libx264,libx265,...)。(3) 直播方向:  精通各种直播协议(rtsp,rtmp,hls,http-flv,...), 钻研各个开源库(live555,darwin,srs,zlmediakit,crtmpserver,...)(4) 视频监控:  理论+开源库(onvif+281818)(EasyMonitor、iSpy、ZoneMinder(web)、...) 3.项目实战(1) Qt项目:  至少要亲手练习10个实战项目(网络服务器、多线程、数据库、图像处理、多人聊天、等等)(2)音视频项目:包括编解码、视频监控、直播等各个方向,都需要亲手实战项目,包括视频服务器、后台管理系统、前端播放器(多端)---------------------------------------------------  第1章 C++11新特性 41). nullptr关键字与新语法 42). auto和decltype类型推导 6 auto讲解 6 auto示例 7 decltype 83). for区间迭代 94). 初始化列表 105). 模板增强 11外部模板 11类型别名模板 12默认模板参数 126). 构造函数 13委托构造 13继承构造 147). Lambda 表达式 158). 新增容器 20std::array 20std::forward_list 21无序容器 22元组 std::tuple 239). 正则表达式 2610). 语言级线程支持 28多线程库简介 2811). 右值引用和move语义 31右值引用和move语义 32转移左值 3412). constexpr 35第2章 C++14新特性 36Lambda 函数 36类型推导 37返回值类型推导(Return type deduction) 37泛型lambda 39[[弃用的]]  [[deprecated]]属性 40二进制数字和数字分隔符 41第3章 C++17新特性 42安装GCC10.2 42安装msys2-x86_64-20200720 42更新镜像 42更新软件库 43安装 MinGW64 等必要的软件 43环境变量Path 43编译命令 43constexpr 44typename 45折叠表达式 47结构化绑定 48条件分支语句初始化 49聚合初始化 50嵌套命名空间 52lambda表达式捕获*this的值 53改写/继承构造函数 54用auto作为非类型模板参数 55__has_include 56fallthrough 57nodiscard 57maybe_unused 58第4章 C++20新特性 59编译命令 59concept 59typename 60explicit 61constinit 62位域变量的默认成员初始化 62指定初始化 63基于范围的for循环初始化 64放宽基于范围的for循环,新增自定义范围方法 65嵌套内联命名空间 66允许用圆括弧的值进行聚合初始化 67unicode字符串字面量 68允许转换成未知边界的数组 68likely和unlikely 69第5章 C++2.0(11/14/17/20)总结与分析 705.1 C语言与C++ 715.2 语言可用性的强化 725.2.1 常量 725.2.2 变量及其初始化 735.2.3 类型推导 745.2.4 控制流 765.2.5 模板 775.2.6 面向对象 815.3 语言运行期的强化 835.3.1 Lambda 表达式 835.3.2 右值引用 865.4 容器 885.4.1 线性容器 885.4.2 无序容器 895.4.3 元组 895.5 智能指针与内存管理 905.5.1 RAII 与引用计数 905.5.2 std::shared_ptr 905.5.3 std::unique_ptr 915.5.4 std::weak_ptr 91第6章 C++2.0多线程原理与实战 93什么是并发 93并发的方式 93为什么使用并发 95线程简介 96创建线程的三种方式 971. 通过函数 972.通过类对象创建线程 993.通过lambda表达式创建线程 101thread线程的使用 101互斥量与临界区 105期物Future 111条件变量 112原子操作 114内存模型 118第7章 C++2.0线程池原理与实战 120线程线程池的基本原理 1201)、线程 1202)、线程的生命周期 1213)、什么是单线程和多线程 1214)、线程池 1225)、四种常见的线程池 123线程池的架构与流程 123线程池代码实战 125    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值