C++怎么实现一个线程池_C++并发编程与线程池实现

线程池通过复用线程执行任务以减少开销,核心包括线程集合、任务队列、互斥锁、条件变量和控制标志;submit方法提交任务并返回future获取结果,析构时安全关闭确保任务完成。

c++怎么实现一个线程池_c++并发编程与线程池实现

实现一个线程池的核心目标是:复用一组线程来执行多个任务,避免频繁创建和销毁线程带来的开销。在C++中,可以借助std::threadstd::queuestd::mutexstd::condition_variablestd::function工具完成一个高效且线程安全的线程池。

线程池的基本结构

一个典型的线程池包含以下几个部分:

工作线程集合:固定数量的线程,在初始化时启动,等待任务。任务队列:存放待执行的任务(通常为std::function类型)。互斥锁(mutex):保护任务队列的线程安全访问。条件变量(condition_variable):用于通知空闲线程有新任务到来。控制标志:标识线程池是否关闭,是否等待任务完成。

任务提交与执行机制

用户通过submit方法提交可调用对象(如lambda、函数指针、bind表达式),线程池将其包装为std::function放入队列。工作线程循环等待任务,一旦获取到任务就立即执行。

使用std::packaged_task可以方便地获取任务的返回值,通过std::future机制实现异步结果获取。

立即学习“C++免费学习笔记(深入)”;

示例代码片段:

template auto submit(F&& f) -> std::future {    using ReturnType = decltype(f());    auto task = std::make_shared<std::packaged_task>(std::forward(f));    std::future result = task->get_future();    {        std::unique_lock lock(queue_mutex);        if (stop) throw std::runtime_error("submit on stopped ThreadPool");        tasks.emplace([task]() { (*task)(); });    }    condition.notify_one();    return result;}

线程池的生命周期管理

构造函数中启动指定数量的工作线程,每个线程运行一个无限循环,从任务队列中取任务执行。

析构函数需要妥善处理未完成的任务:

设置stop标志位,防止新任务提交。唤醒所有等待中的线程。调用每个线程的join(),确保它们正常退出。

这样可以保证已提交的任务被执行完毕,避免资源泄漏或程序崩溃。

实际使用示例

以下是一个简单的使用场景:

ThreadPool pool(4); // 创建4个线程的线程池

std::vector<std::future> results;for (int i = 0; i < 8; ++i) {results.emplace_back(pool.submit([i] {std::this_thread::sleep_for(std::chrono::seconds(1));return i * i;}));}

for (auto& result : results) {std::cout << result.get() << ' ';}// 输出: 0 1 4 9 16 25 36 49

这段代码提交了8个计算任务,由4个线程并发执行,最后收集结果。

基本上就这些。一个简洁高效的C++线程池不需要复杂设计,关键是正确处理并发同步和资源释放。

以上就是C++怎么实现一个线程池_C++并发编程与线程池实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1483005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 06:52:28
下一篇 2025年12月19日 06:52:40

相关推荐

发表回复

登录后才能评论
关注微信