同时进行的任务 · 并行与并发库

现代计算机都配备了多核处理器,如何充分利用这些计算资源成为了程序性能优化的关键。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