手写线程池
更新时间:2026-10-01。线程创建/销毁昂贵,池化是服务端标配,综合了并发、future、同步原语。
一、核心循环
cpp
while (true) {
std::function<void()> task;
{ unique_lock lk(m);
cv.wait(lk, [&]{ return stop || !q.empty(); });
if (stop && q.empty()) return;
task = std::move(q.front()); q.pop();
}
task();
}submit 把任务包进 packaged_task,返回其 future;谓词式 wait 自动处理虚假唤醒。
二、关闭与进阶
析构时设 stop=true; notify_all(); 再 join;决定是排空还是丢弃在队任务。进阶涉及隔离 panic、防长任务饥饿、按负载扩缩容与多队列 work stealing。

常见坑
- 用
if而非while/谓词导致虚假唤醒出错。 - 析构时不唤醒,线程永久阻塞。
- 任务抛异常未捕获导致 terminate。
小结
总结
线程池用预先创建并复用的 N 个 worker 线程(避免每任务新建/销毁线程的高昂代价)+一个 mutex+condition_variable 保护的任务队列来执行任意 std::function:worker 用谓词式 cv.wait(stop || !q.empty())自动处理虚假唤醒,submit 把任务包进 packaged_task 并返回 future;优雅关闭是关键——析构时置 stop、notify_all 唤醒全部 worker 再 join,并明确在队任务是排空还是丢弃,任务内异常要隔离防止 terminate;它是并发、future、同步原语的集大成练习,进阶再谈防饥饿、动态扩缩容与 work stealing。