同时进行的任务 · 并行与并发库
现代计算机都配备了多核处理器,如何充分利用这些计算资源成为了程序性能优化的关键。C++11 引入了标准的线程库,让并发编程不再依赖平台特定的 API。
让我们探索 C++ 的并行与并发世界。
线程基础
创建和管理线程是并发编程的起点:
#include <iostream>
#include <thread>
void hello()
{
std::cout << "Hello from thread!" << std::endl;
}
void greet(const std::string& name)
{
std::cout << "Hello, " << name << "!" << std::endl;
}
int main()
{
// 创建线程
std::thread t1(hello);
// 带参数的线程
std::thread t2(greet, "World");
// Lambda 线程
std::thread t3([]() {
std::cout << "Hello from lambda!" << std::endl;
});
// 等待线程完成
t1.join();
t2.join();
t3.join();
return 0;
}分离线程
互斥量与锁
多线程访问共享数据需要同步:
unique_lock:更灵活的锁
避免死锁:同时锁定多个互斥量
条件变量
用于线程间的等待和通知:
原子操作
对于简单的共享变量,原子操作比互斥量更高效:
原子标志与自旋锁
future 与 promise:异步返回值
promise:手动设置结果
packaged_task:包装可调用对象
并行算法(C++17)
C++17 为标准算法添加了并行执行策略:
执行策略:
std::execution::seq- 顺序执行std::execution::par- 并行执行std::execution::par_unseq- 并行且可向量化
线程池实现
读写锁(C++14/17)
线程局部存储
协程(C++20)
C++20 引入了协程,实现更自然的异步编程:
总结
工具
用途
std::thread
创建和管理线程
std::mutex
互斥访问共享资源
std::lock_guard
RAII 风格的锁
std::condition_variable
线程间等待/通知
std::atomic
无锁的原子操作
std::future/promise
异步返回值
std::async
简单的异步任务
std::execution
并行算法执行策略
std::shared_mutex
读写锁
thread_local
线程局部存储
协程
轻量级异步
掌握这些工具,你就能写出高效的并发程序,充分发挥多核处理器的威力!
Last updated