Introduction 自 C++11 开始,很多更新都集中在并发支持上,从最初的线程基础支持,到如今的协程,C++ 已经日趋完善。 协程是继线程之后的又一利器,若论年龄,协程倒比线程要大。由于早期的线程主要在单 CPU 上运行,仅是模拟多线程,故又称“伪线程”。伪线程和协程的思路颇有相似之处,以致难以旌别,其实它们各有应用场景。 本篇将回答下列问题: 什么是协程? 协程与进程和线程有何区别? 什么是并发,和并行有何区别? 协程和函数有何区别? 什么是有栈协程,无栈协程? 协程的使用场景有哪些? Coroutines TS 是什么? 如何使用 C++20 Coroutines? 本篇旨在明析概念,不会出现太多代码,概念清晰后,下篇将有大量代码来解析协程。 Concurrency versus Parallelism 要理清协程的定位,须得先能够旌别并发与并行。可以先来看看百科的定义: 并行是指“并排行走”或“同时实行或实施”。 在操作系统中是指,一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。 对比地,并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)。 这里用了两个词:宏观和微观。宏观指从大的角度来看,微观指从小的角度来说。通俗地说,宏观指的是能够通过眼睛看到的,微观则是眼睛看不到的。并发在宏观上同时,微观上为顺序执行。这就是伪线程的实现思路,通过迅速地在各个模块之间切换执行,以迷惑视觉,使得看起来像是同时执行的,其实底层依旧是顺序执行的。 线程在早期并非必须,因为都是命令窗口,就是从上往下依次执行的。而 Windows 拥有界面,在执行任务之时可以随意进行别的操作,因此界面常常会卡死。MS 便搞了个模拟同步运行的机制,便是线程。了解过 CPU 发展历史的会知道,早期 CPU 频率步步直升,人们都以为这种趋势能够持续下去。这也意味着你写的程序不用更新也能随着 CPU 的增强而自动增强性能。… Continue Reading