C++11 线程并发学习(一)

本文关键词:C++11 多线程 多进程 并发

概述:C++11标准的发布使得C++变得更加强大,其中最重要的特性是支持了多线程。这也是C++标准第一次在语言上承认了多线程应用。C++标准包含了C++语言本身和官方C++库。并且,在C++11标准之前是没有进程和线程的,而C++11标准承认了线程,并在官方C++库中提供了编写多线程程序的相关组件。本文以线程并发作为学习方向,记录博主本人的学习过程。

一、C++并发实现的依靠

C++11标准之前 C++11标准
无进程 无线程 无进程 有线程
  1. 在C++11标准之前,多线程的C++应用程序主要是依靠于两类实现(包括但不限于)
编译器相关扩展 通用类库(非官方)
POSIX C 或 Windows API Boost 或 ACE

(1)编译器相关扩展
编译器供应商通过与平台相关的扩展来支持多线程。提供给C++调用的C接口来达到多线程应用的目的。其缺点就是开发人员需要针对不同的平台去编写多线程代码。
(2)C++通用类库
Boost、ACE等C++类库通过封装平台相关的API。并提供高级的多线程工具,极大的简化了开发多线程应用的工作。当然,获取便利的同时也将失去底层的灵活性,甚至在相关性能瓶颈上也无法突破。
(3)即使在编译器和通用库的线程支持下,仍然存在在某些场合下的不适用情况。因此C++本身对线程的支持才显得十分必要。如果你追求的是极致的性能,那么你需求尽量避免高级工具所带来的实现成本

二、什么是并发(concurrency)?

百度百科:并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

通俗的说,并发是指多个任务在一段时间内快速的切换执行,但在具体的某个时间点上,只有一个任务在执行。并发概念大于硬件并发(hardware concurrency),硬件并发是指多个处理器同时执行多个任务,在同一时间点上,有多个任务同时进行。当然,在这个时间点上,一个处理器上有且仅有一个任务正在执行。
并发分类:(1)单核并发 (2)多核并发(硬件并发)
任务切换(task switching)会有一定的开销。最理想的情况是避免多任务在多核心上进行任务切换,让CPU尽可能的被使用在执行任务上,而非不必要的切换上。
第二种情况是最为理想的,没有不必要的任务切换,使得每个任务可以最大限度的使用CPU。因此,编写多线程应用程序应尽量使得 线程数 = 整数倍的核心数
C++11 线程并发学习(一)_第1张图片

三、多进程并发与多线程并发

了解多进程与多线程各自的并发特性,明确在什么时候、什么场景下用哪种并发。

1.多进程并发
多进程并发是将应用程序分为多个拥有单线程的、独立存在的进程。一个进程中至少拥有有一个线程,一个线程的存在必须依托于一个进程。
(1)操作系统必须为每个进程投入资源,以便于操作系统对进程的管理,且每个进程拥有各自的进程控制块(Processing Control Block)
(2)进程之间相互独立存在,拥有各自不同的地址空间,操作系统对进程提供数据保护(不讨论写时复制等技术)
(3)启动进程需要一定的时间和系统开销
(4)进程间通信是不同进程传递数据的唯一方式,且有一定的开销,包括信号、文件、管道、套接字、共享内存等
(5)分布式、集群等网络连接的程序依托于进程为基础,是一种特别的进程间通信(套接字)
(6)通信复杂、速度慢、大量保护操作并不一定都是缺点,至少使用进程比线程更容易编写出安全的并发代码
C++11 线程并发学习(一)_第2张图片
2. 多线程并发
多线程并发是指单个进程中运行多个线程。线程就像一个轻量级的进程,其开销远小于进程。所有的线程都将独立的运行,且每个线程都能执行不同的指令序列。所有线程共享相同的地址空间。
但对于操作系统(Operating System)而言,线程是不可见的,操作系统在任务切换中是以进程为单位,而切换任务以后,操作系统不关心该任务是由哪些指令序列组成
(1)线程由进程管理,其管理开销远小于进程
(2)线程之间相互独立,但拥有相同地址空间,线程间没有数据保护
(3)启动线程的开销远小于进程
(4)线程间通信,读写公共资源即可。全局指针、变量、引用、共享内存等
(5)互斥访问控制,避免数据混乱,对编程人员要求高
C++11 线程并发学习(一)_第3张图片

  1. 多进程、多线程组合
    多个进程中运行多个线程,且 线程数>进程数
    多线程解决方案主要提升的是单台计算的的并发于计算性能,多进程方案更多的是体现在其能完成不同计算机之间的互连。
    考虑如下情形,100台计算机各自运行相互独立的进程,且以网络连接的方式完成连接(分布式、集群),每台计算机的相关进程以多线程方式提升单台处理能力。
    C++11 线程并发学习(一)_第4张图片

四、并发知识总结

  1. 当你的代码量过于庞大时,使用并发以分离相互独立的任务,就像以函数调用填充main函数一样。
  2. 对程序进行性能提升时,考虑不同场景下的不同并发。
  3. 使用并发并不一定能达到优化的目的,考虑并发所带来的开销、缺陷,与收益进行权衡。
  4. 使用了并发的程序,其复杂度提升是成倍的,能不用就不用,要用就要慎重考虑每一个细节。

参考书籍:《C++并发编程实战》
学习交流QQ:1006534767
版权声明:本文为博主原创文章,转载请标明出处,原文地址:
https://blog.csdn.net/qq_36359022/article/details/84570550
如果感觉本文对您有帮助,请点赞支持一下,您的支持是我坚持写作最大的动力,谢谢!

你可能感兴趣的:(C++)