Featured image of post Cpp Concurrency

Cpp Concurrency

Concurrency in C++

C++ 并发编程

引言

最近在实习中涉及到无向图上的最短路计算,包含非常多点和边,这种大量数据的处理如果采用串行的方式执行,效率将会十分低下。除了考虑优化算法,利用多处理器和分布式技术来提升性能也是一种选择。借此机会学习 C++ 语言中的并发编程。

概念

并发和并行

并发是同一时间应对多种事件的能力 - Rob Pike

并发(Concurrent)和并行(Parallel)都是很常见的术语,经常给人们造成困扰。Erlang 之父 Joe Armstrong 曾经用咖啡机的使用场景为例生动描述了这两个术语。

con_and_par

上图很直观的体现了:

  • 并发(Concurrent)是多个队伍交替使用同一个咖啡机,最终每个人都能接到咖啡。
  • 并行(Parallel)是存在多台咖啡机供每个队列使用,最终也是每个人都能接到咖啡,但效率更高。

将队伍中的人换成计算机的任务,咖啡机换成处理器,就成了计算机中的多任务场景。并发和并行都是对“多任务”处理的描述,其中并发是轮流处理,而并行是同时处理。

“并行”概念是“并发”概念的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。

在不考虑处理器数量的情况下,我们统称之为“并发”。

进程和线程

进程和线程是操作系统的基本概念。

进程(英语:process),是指电脑中已执行的程式,曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的 UNIX,Linux 2.4 及更早的版本)中,是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6 及更新的版本)中,进程本身不是基本执行单位,而是线程的容器。

线程(英语:thread)在计算机科学中,是将进程划分为两个或多个线程(实例)或子进程,由单处理器(单线程)或多处理器(多线程)或多核处理系统并发执行。它是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。

未完待续

参考

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计