C++11多线程并发编程(一)


最近想学习一下C++多线程并发编程,但是去网上找了一圈,发现很少有完整的多线程并发教程,只在腾讯课堂找到“KuangXiang”老师发布的一门《C++11并发与多线程》课程,还挺长挺详细的,有兴趣的朋友可以去看看。本系列博客实际上是将我学习过程中的一些笔记,理解发布出来,供大家参考学习,如果有不对的地方欢迎指教。

一、 线程与进程

可能只有像我这样半路出家的人才会不明白线程和进程的区别,但是考虑到广大自学C++的朋友,这边给简单解释一下,如果还是不明白可以上知乎上搜索一下(我就是查了知乎才明白的)。
1.可执行文件,对于windows系统来说,就是一个.exe文件(我们的代码编译之后会在项目的Debug/Release文件夹中产生的一个可以运行的文件)。
C++11多线程并发编程(一)
2.进程,双击.exe文件,即可将可执行文件转为一个进程。即进程就是一个正在运行的程序。打开电脑的任务管理器,如下图所示,每个正在运行的软件就是一个进程。
C++11多线程并发编程(一)
3.线程,如果说进程是操作系统执行的一系列children,那么线程可以理解为进程执行的一系列children。另外,每个程序至少有一个线程,即主线程。也可以理解为main函数,那么多线程运行时,就相当于一个代码中同时有多个main函数同步运行。C++11多线程并发编程(一)

二、 并发与并行

  1. 并发,如果有两列队伍排队买票,但是只有一个售票窗口,那么售票员可以依次对两个队伍售票。只要有多列队伍就可以说程序具有了并发的能力,由于早期计算机只有单核,即“只有一个售票窗口”,所以,这种并发并不能使计算效率得到提高,仅可以随机在两列队伍中切换当前售票的队伍。下面举例一个简单的应用场景帮助理解早期并发的意义。
    C++11多线程并发编程(一)
    例:一个游戏服务器需要同时具备以下功能:1、随时获取玩家需求;2、随时执行玩家需求;一个优秀的服务器当然不能等所有的玩家需求都获取完了之后再挨个执行(单线程模式)。那么“早期并发”即具备了存在的意义,即在两个项任务中随机切换当前执行的任务

  2. 并行,同样是两列买票的队伍,由于买票人数太多了,领导决定增加一个临时售票口(程序换到了拥有多核CPU的电脑上),于是两列队伍便可以同时买票,那么速度当然比之前快了一倍,那么两列队伍同时售票即是并行
    C++11多线程并发编程(一)

  3. 注意,理论上来说双线程并行程序会比单线程程序快一倍,但是如果并行程序的两个线程访问的是同一个东西的话,其运行速度与并不一定比单线程快。例如:虽然有了两个售票窗口,但是只有一台打印机,那么两个售票窗口只能共用这一台打印机,其速度并没有变快。

C++11多线程并发编程(一)

C++11对并发编程的支持

我搜索学习资料的时候发现很多以前的教程需要添加各种各样的资源文件才能支持并发编程(没有深入了解,也许有特殊用意),但是C++11以来,C++语言内部支持了并发编程,只需要添加thread头文件即可,如下图。
C++11多线程并发编程(一)