C++并发编程 1:多线程基础
为什么使用并发
-
分离关注点 通过将相关的代码与无关的代码分离,可以使程序更容易理解和测试,从而减少出错的可能性。
用并发技术分离关注点的依据是设计理念,而不是以增加运算吞吐量为目的。
-
性能提升
- 任务并行:将一个单个任务分成几部分,且各自并行运行,从而降低总运行时间。
- 数据并行:每个线程在不同的数据部分上执行相同的操作。
什么情况避免使用并发
不使用并发的唯一原因就是收益比不上成本。
C++中的并发库
C++ 11
C++ 11引入了一整套内存模型和线程支持库。
std::thread: 创建和管理线程。std::mutex: 互斥锁。std::recursive_mutex:递归锁。std::lock_guard和std::unique_lock: RAII的锁管理类。std::condition_variable: 条件变量。std::atomic: 原子操作库。std::future、std::promise和std::async:: 异步任务。
C++ 14
std::shared_timed_mutex:引入了一种支持多读单写的互斥锁。std::shared_lock: 同时管理多个互斥锁。
C++ 17
- 并行STL算法。
std::scoped_lockstd::shared_mutex
C++ 20
- coroutines:协程支持。
std::jthreadstd::barrier和std::latchstd::counting_semaphore和std::binary_semaphore:信号量。
C++线程库的效率
- 在实现相同功能的前提下,直接使用底层API相比C++线程库并不会带来过多的性能收益。
- 零成本抽象:未被使用的功能完全不产生额外开销。