0

0

c++怎么实现一个简单的线程池_线程池设计与实现

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-10-14 22:31:01

|

471人浏览过

|

来源于php中文网

原创

线程池通过复用线程执行任务,减少开销。由任务队列、线程集合、互斥锁、条件变量和停止标志组成。使用enqueue提交任务,内部用packaged_task封装可调用对象并返回future获取结果。工作线程从队列取任务执行,支持任意函数对象。析构时通知所有线程退出并等待回收。示例中创建4线程池,提交8个计算任务,输出平方值。适用于固定负载场景,需注意任务不应长时间阻塞,异常应在任务内处理。

c++怎么实现一个简单的线程池_线程池设计与实现

实现一个简单的C++线程池,核心目标是复用一组线程来执行多个任务,避免频繁创建和销毁线程带来的开销。下面是一个轻量级、可运行的线程池设计与实现,适用于大多数基础场景。

线程池的基本结构

一个基本的线程池包含以下几个组成部分:

  • 任务队列:存放待执行的任务(通常为函数对象)。
  • 线程集合:一组工作线程,从任务队列中取出任务并执行。
  • 同步机制:使用互斥锁(mutex)和条件变量(condition_variable)保证线程安全。
  • 控制开关:标记线程池是否关闭,用于优雅退出。

任务提交与执行逻辑

用户通过 enqueue 方法提交任务,任务被推入队列。空闲线程会监听队列变化,一旦有新任务就立即取出执行。使用 std::functionstd::packaged_task 可以方便地支持任意可调用对象,并返回 std::future 获取结果。

关键点:

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

  • 任务队列为线程安全的阻塞队列。
  • 使用条件变量唤醒等待线程。
  • 主线程可在需要时等待任务完成。

代码实现示例

#include 
#include 
#include 
#include 
#include 
#include 
#include 

class ThreadPool { public: explicit ThreadPool(size_t numThreads) : stop(false) { for (size_t i = 0; i < numThreads; ++i) { workers.emplace_back([this] { while (true) { std::function task; { std::unique_lock lock(queue_mutex); condition.wait(lock, [this] { return stop || !tasks.empty(); }); if (stop && tasks.empty()) return; task = std::move(tasks.front()); tasks.pop(); } task(); } }); } }

templatezuojiankuohaophpcnclass Fyoujiankuohaophpcn
auto enqueue(F&& f) -youjiankuohaophpcn std::futurezuojiankuohaophpcndecltype(f())youjiankuohaophpcn {
    using return_type = decltype(f());
    auto task = std::make_sharedzuojiankuohaophpcnstd::packaged_taskzuojiankuohaophpcnreturn_type()youjiankuohaophpcnyoujiankuohaophpcn(std::forwardzuojiankuohaophpcnFyoujiankuohaophpcn(f));
    std::futurezuojiankuohaophpcnreturn_typeyoujiankuohaophpcn result = task-youjiankuohaophpcnget_future();
    {
        std::lock_guardzuojiankuohaophpcnstd::mutexyoujiankuohaophpcn lock(queue_mutex);
        if (stop) throw std::runtime_error("enqueue on stopped ThreadPool");
        tasks.emplace([task]() { (*task)(); });
    }
    condition.notify_one();
    return result;
}

~ThreadPool() {
    {
        std::unique_lockzuojiankuohaophpcnstd::mutexyoujiankuohaophpcn lock(queue_mutex);
        stop = true;
    }
    condition.notify_all();
    for (std::thread &worker : workers)
        worker.join();
}

private: std::vector<:thread> workers; std::queue<:function>> tasks;

std::mutex queue_mutex;
std::condition_variable condition;
bool stop;

};

iWebMall多用户商城系统
iWebMall多用户商城系统

iWebMall 是一款高性能高扩展能力的开源 LAMP 电子商务软件,定位为大中型电子商务平台软件,服务于有建立电子商务需求的商业客户。这些商业客户不必学习任何计算机编程代码知识,只需要使用 iWebMall 软件他们就可以轻松建立一个功能强大的网上商城,实现用户注册、产品展示、在线定购、在线支付等电子商务功能;iWebMall 集成了产品发布与查询、会员注册登录、购物车、在线订单、在线支付、在

下载

使用方式与注意事项

这个线程池使用非常简单:

int main() {
    ThreadPool pool(4); // 创建4个线程的线程池
std::vectorzuojiankuohaophpcnstd::futurezuojiankuohaophpcnintyoujiankuohaophpcnyoujiankuohaophpcn results;
for (int i = 0; i zuojiankuohaophpcn 8; ++i) {
    results.emplace_back(
        pool.enqueue([i] {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            return i * i;
        })
    );
}

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

return 0; // 线程池析构时自动清理

}

注意:

  • 构造时指定线程数量,建议根据CPU核心数调整。
  • 任务应尽量无阻塞或短时执行,避免线程饥饿。
  • 不支持动态增减线程,适合固定负载场景。
  • 异常处理需在任务内部进行,否则会导致线程退出。

基本上就这些。这个实现简洁、高效,适合学习和中小型项目使用。

相关专题

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

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

175

2023.11.23

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

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

97

2025.11.27

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

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

482

2023.08.10

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

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

482

2023.08.10

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

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

61

2025.12.01

function是什么
function是什么

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

480

2023.08.04

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

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

163

2023.10.07

Java编译相关教程合集
Java编译相关教程合集

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

9

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

3

2026.01.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.2万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.2万人学习

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

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