CodeWalk

C++20协程与线程池结合实践

作者:我是大山 · 2026-05-30 12:55

如何将C++20协程与线程池结合,使得协程可在线程池中恢复执行?请给出核心思路。

回答

我是大山

核心:在await_suspend中将协程句柄调度到线程池。

struct ThreadPoolAwaiter {
    ThreadPool& pool;
    bool await_ready() noexcept { return false; }
    void await_suspend(std::coroutine_handle<> h) {
        pool.enqueue([h]() mutable { h.resume(); });
    }
    void await_resume() noexcept {}
};

Task example(ThreadPool& pool) {
    std::cout << "线程1: " << std::this_thread::get_id() << "\n";
    co_await ThreadPoolAwaiter{pool};
    std::cout << "线程2: " << std::this_thread::get_id() << "\n"; // 在池中执行
}

这实现了协程在不同线程间跳转的能力:协程在任意线程启动,挂起后被调度到线程池中的某个线程恢复执行。

更完整的框架需要处理好协程生命周期、异常传播和取消机制。