📄️ 1 - 多线程编程概述
几十年前,程序都是单线程的,CPU市场竞争的是最高频率。但在05年左右单核处理器的性能达到瓶颈,CPU市场开始竞争单个处理器芯片中的最多核心数目,多线程编程便开始发展,并成为主流。通过多线程编程课并行执行多个计算,充分利用系统中多个处理器单元。
📄️ 2 - 线程的基本使用
本文将会介绍如何用``线程库创建一个线程,包括使用函数指针,可调用对象等方式创建;以及线程的阻塞/挂起操作;线程参数的传递;一些概念等内容。
📄️ 3 - 自动join线程
在C++20中引入了std::thread相比,它:
📄️ 4 - 原子操作库atomic
原子类型允许原子访问,这意味着不需要额外的同步机制就可执行并发的读写操作。没有原子操作,递增变量就不是线程安全的。因为编译器首先将值从内存加载到寄存器中,递增后再把结果保存回内存。另一个线程可能在递增操作执行中接触到内存,导致数据争用。
📄️ 5 - 互斥Mutex
对于简单数据(整数、布尔值等标量)的线程安全,使用原子操作就够了。但当数据更复杂且必须在多个线程中使用这些数据时,就得使用显式的同步机制。
📄️ 6 - 条件变量
条件变量允许一个线程堵塞,直到另一个线程设置某个条件或系统时间到达某个指定的时间。条件变量允许显式的线程间通信,如果熟悉Win32API的多线程编程,可将条件变量和Windows种的事件对象进行比较。
📄️ 7 - latch和barrier
C++20提供了两种线程协调机制,std::barrier(屏障),允许任何数量的线程阻塞阻塞,直至期待数量的线程到达。
📄️ 8 - 信号量semaphore
C++20提供了信号量semaphore,可用作其他同步机制(如mutex,latch,barrier)的构件块。
📄️ 9 - future
当线程结束执行时,不容易取回计算的结果。可以利用std::future获得线程运行的结果。