42.2 线程

thread是计算的概念在计算机硬件层面的抽象。C++标准库thread的设计目标是与操作系统线程形成一对一映射。当程序中多个任务需要并发进行时,我们就可以使用thread。在一个多处理单元(“核心”)的系统上,thread可以充分利用这些单元。所有thread工作于同一个地址空间中。如果你希望硬件能防止数据竞争,则应使用进程。thread间不共享栈,因此局部变量不会产生数据竞争问题,除非你不小心将一个局部变量的指针传递给其他thread。我们要特别小心lambda中的引用方式的上下文绑定(见11.4.3节)。深思熟虑地、小心地共享栈内存空间很有用,也很常见。例如,我们可能将一个局部数组的不同部分传递给一个并行排序函数。

如果一个thread不能继续前进(比如,因为它遇到了一个其他thread所拥有的mutex),我们称它处于阻塞(blocked)或睡眠(asleep)状态。

一个thread表示一个系统资源,一个系统线程(system thread),甚至可能有专用硬件:

因此,thread可以移动但不能拷贝。

作为一个源被移动后,thread就不再表示一个计算线程了。特别是,它不能被join()了。

操作thread::hardware_concurrency()报告硬件支持多少个任务同时执行。其具体含义依赖于机器体系结构,但通常小于操作系统提供的线程数(例如,通过时间多路复用或时间分片),有时大于处理器数或“核心数”。例如,我的双核小笔记本报告有四个硬件线程(它使用了超线程(hyper-threading)技术)。 ...

Get C++程序设计语言(第4部分:标准库)(原书第4版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.