0

0

C++如何实现一个线程池_C++多线程并发与线程池设计

尼克

尼克

发布时间:2025-11-11 20:57:02

|

736人浏览过

|

来源于php中文网

原创

线程池通过复用线程减少创建销毁开销并控制并发,C++中可用std::thread、std::queue、std::mutex和std::condition_variable实现;其核心包括工作线程集合、任务队列、同步机制与生命周期管理;通过enqueue提交任务,使用std::packaged_task和std::future获取返回值,互斥锁保护队列,条件变量通知任务到达;析构时需停止新任务、唤醒线程并join,确保资源释放;示例中创建4线程池提交10个任务,验证了线程安全与结果获取;关键在于正确处理同步、避免死锁、异常安全及及时唤醒。

c++如何实现一个线程池_c++多线程并发与线程池设计

线程池的核心目标是复用线程、减少频繁创建销毁带来的开销,同时控制并发数量。在C++中,借助std::threadstd::queuestd::mutexstd::condition_variable,可以实现一个高效且线程安全的线程池。

线程池的基本结构

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

  • 工作线程集合:固定数量的线程在后台等待任务。
  • 任务队列:存放待执行的函数对象(std::function)。
  • 同步机制:互斥锁保护共享数据,条件变量用于通知线程有新任务。
  • 生命周期管理:支持优雅关闭,等待所有任务完成。

任务提交与执行机制

用户通过enqueue方法提交任务,线程池将任务推入队列并唤醒一个工作线程。每个线程循环等待任务,取出后立即执行。

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

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

示例代码片段:

template
auto enqueue(F&& f) -> std::future> {
    using return_type = typename std::invoke_result_t;
auto task = std::make_sharedzuojiankuohaophpcnstd::packaged_taskzuojiankuohaophpcnreturn_type()youjiankuohaophpcnyoujiankuohaophpcn(std::forwardzuojiankuohaophpcnFyoujiankuohaophpcn(f));
std::futurezuojiankuohaophpcnreturn_typeyoujiankuohaophpcn res = task-youjiankuohaophpcnget_future();

{
    std::unique_lockzuojiankuohaophpcnstd::mutexyoujiankuohaophpcn lock(queue_mutex);
    tasks.emplace([task]() { (*task)(); });
}
condition.notify_one();
return res;

}

红墨
红墨

一站式小红书图文生成器

下载

线程安全与资源管理

任务队列必须被互斥锁保护,避免多个线程同时修改导致数据竞争。条件变量配合wait使用时需注意虚假唤醒,通常用while循环检查条件。

在线程池析构时,应设置停止标志,唤醒所有等待线程,并join它们,确保资源正确释放。

关键点:

  • 析构前调用stop()方法,防止新任务进入。
  • 使用shared_ptr管理任务,避免裸指针。
  • 避免死锁:加锁范围尽量小,不在线程锁内执行未知耗时操作。

实际使用示例

创建4个线程的线程池,提交10个打印任务:

ThreadPool pool(4);
std::vector> results;

for (int i = 0; i < 10; ++i) { results.emplace_back(pool.enqueue([i] { std::cout << "Task " << i << " running on thread " << std::this_thread::get_id() << '\n'; return i * i; })); }

// 获取结果 for (auto& f : results) { std::cout << "Result: " << f.get() << '\n'; }

基本上就这些。一个简洁高效的线程池不需要复杂设计,重点是线程安全、资源管理和易用性。不复杂但容易忽略细节,比如异常安全和及时唤醒。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

81

2023.09.25

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

92

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

471

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

107

2025.12.24

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

54

2025.12.01

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

471

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

158

2023.10.07

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号