0

0

c++中如何实现一个线程池_C++多线程线程池设计与实现

冰火之心

冰火之心

发布时间:2025-09-20 17:19:01

|

961人浏览过

|

来源于php中文网

原创

线程池通过复用线程执行任务,降低开销。1. 包含工作线程、任务队列、互斥量、条件变量和控制开关;2. 任务以std::function存入队列;3. 线程取任务时加锁,空时阻塞等待;4. 关闭时所有线程退出。

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

在C++中实现一个线程池,核心目标是复用一组线程来执行多个任务,避免频繁创建和销毁线程带来的开销。一个高效的线程池通常包含任务队列、线程集合、线程同步机制以及任务调度逻辑。

线程池的基本结构

一个典型的线程池由以下几个部分组成:

  • 工作线程集合:固定数量的线程,在初始化时启动,等待任务。
  • 任务队列:存放待执行的任务(通常为函数对象),使用队列结构(如std::queue)管理。
  • 互斥量与条件变量std::mutex保护共享任务队列,std::condition_variable用于通知空闲线程有新任务到来。
  • 控制开关:标识线程池是否运行,用于安全关闭。

任务提交与执行机制

用户通过submit()方法提交可调用对象(如lambda、函数指针、bind结果等)。这些任务被封装成std::function类型存入任务队列。

工作线程在循环中尝试从队列取任务:

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

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

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

下载
  • 加锁获取任务队列。
  • 若队列非空,取出任务并解锁后执行。
  • 若队列为空且线程池运行中,则通过条件变量阻塞等待。
  • 若线程池已停止且队列为空,线程退出。

示例代码片段:

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();
                }
            });
        }
    }

    template
    void submit(F&& f) {
        {
            std::lock_guard lock(queue_mutex);
            tasks.emplace(std::forward(f));
        }
        condition.notify_one();
    }

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

private:
    std::vector workers;
    std::queue> tasks;
    std::mutex queue_mutex;
    std::condition_variable condition;
    bool stop;
};

使用方式与注意事项

使用该线程池非常简单:

ThreadPool pool(4); // 创建4个线程的线程池
for (int i = 0; i < 8; ++i) {
    pool.submit([i]() {
        std::cout << "Task " << i << " running on thread "
                  << std::this_thread::get_id() << std::endl;
    });
}
// 析构时自动等待所有线程完成

注意点:

  • 避免在任务中长时间阻塞主线程或死锁。
  • 确保任务捕获的外部资源生命周期长于任务执行时间。
  • 线程池析构前应保证所有任务提交完毕,否则可能提前终止。

基本上就这些。一个简洁有效的C++线程池不需要复杂设计,关键是正确处理线程同步和资源释放。不复杂但容易忽略细节。

相关专题

更多
lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

187

2025.11.08

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

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

471

2023.08.10

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

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

107

2025.12.24

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

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

107

2025.12.24

function是什么
function是什么

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

470

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源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

php网站源码教程大全
php网站源码教程大全

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

1

2025.12.31

热门下载

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

精品课程

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

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.6万人学习

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

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