全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何实现线程池_C++11手动实现一个简单的固定大小线程池

C++11中可通过std::thread、std::queue、std::mutex、std::condition_variable和std::function实现固定大小线程池,核心包括任务队列、互斥锁、条件变量、线程数组和停止标志;构造时启动指定数量线程并循环等待任务,任务通过enqueue提交并返回std::future支持获取结果,内部使用std::packaged_task包装任务,析构时设置停止标志并通知所有线程退出,确保资源正确释放,适用于避免频繁创建销毁线程的场景。

在C++11中,可以利用标准库提供的std::threadstd::queuestd::mutexstd::condition_variablestd::function等工具手动实现一个简单的固定大小线程池。这种线程池能够复用一组线程来执行多个任务,避免频繁创建和销毁线程的开销。

线程池的基本原理

线程池包含一个任务队列和一组工作线程。任务被提交到队列中,空闲线程从队列中取出任务并执行。主要组件包括:

  • 任务队列:存放待执行的函数对象(std::function
  • 互斥锁:保护任务队列的线程安全访问
  • 条件变:用于通知线程有新任务到来
  • 线程数组:存储固定数量的工作线程
  • 停止标志:控制线程循环退出

实现代码示例

下面是一个简单的固定大小线程池实现:

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

    template
    auto enqueue(F&& f) -> std::future::type> {
        using return_type = typename std::result_of::type;

        auto task = std::make_shared>(
            std::forward(f)
        );

        std::future res = task->get_future();
        {
            std::unique_lock lock(queue_mutex);
            if (stop) {
                throw std::runtime_error("enqueue on stopped ThreadPool");
            }
            tasks.emplace([task]() { (*task)(); });
        }
        condition.notify_one();
        return res;
    }

    ~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;
};

使用方式

创建一个4线程的线程池,并提交几个任务:

int main() {
    ThreadPool pool(4);

    // 提交任务并获取 future
    auto result1 = pool.enqueue([]() {
        std::cout << "Task 1 running on thread " << std::this_thread::get_id() << std::endl;
        return 42;
    });

    auto result2 = pool.enqueue([]() {
        std::cout << "Task 2 running on thread " << std::this_thread::get_id() << std::endl;
        return 84;
    });

    // 等待结果
    std::cout << "Result1: " << result1.get() << std::endl;
    std::cout << "Result2: " << result2.get() << std::endl;

    return 0;
}

关键点说明

该实现的核心机制如下:

  • 构造时启动线程:在构造函数中启动指定数量的线程,每个线程运行一个无限循环等待任务
  • 任务提交与返回值支持:使用std::packaged_task包装任务,使enqueue能返回std::future
  • 优雅关闭:析构函数设置停止标志,唤醒所有线程并等待其结束
  • 线程安全:通过互斥锁保护任务队列,条件变量实现线程阻塞/唤醒
基本上就这些。这个线程池虽然简单,但具备了核心功能,适合学习和小型项目使用。


# 工具  # ai  # c++  # ios  # stream  # 标准库  # red  # 构造函数  # 析构函数  # void  # 循环  # 线程  # Thread  # function  # 对象  # 互斥  # 是一个  # 几个  # 多个  # 适用于  # 可通过  # 可以利用  # 创建一个  # 基本原理  # 中取 


相关文章: 再谈Python中的字符串与字符编码(推荐)  教学网站制作软件,学习*后期制作的网站有哪些?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  平台云上自主建站:模板化设计与智能工具打造高效网站  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  建站之星后台管理:高效配置与模板优化提升用户体验  网站制作话术技巧,网站推广做的好怎么话术?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  电商平台网站制作流程,电商网站如何制作?  如何在Windows 2008云服务器安全搭建网站?  如何用5美元大硬盘VPS安全高效搭建个人网站?  创业网站制作流程,创业网站可靠吗?  在线教育网站制作平台,山西立德教育官网?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  微信小程序 input输入框控件详解及实例(多种示例)  C#怎么使用委托和事件 C# delegate与event编程方法  广东企业建站网站优化与SEO营销核心策略指南  大连网站设计制作招聘信息,大连投诉网站有哪些?  建站之星如何取消后台验证码生成?  如何正确下载安装西数主机建站助手?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何快速启动建站代理加盟业务?  定制建站方案优化指南:企业官网开发与建站费用解析  如何通过万网虚拟主机快速搭建网站?  建站之星后台密码如何安全设置与找回?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  建站之星代理商如何保障技术支持与售后服务?  英语简历制作免费网站推荐,如何将简历翻译成英文?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  ui设计制作网站有哪些,手机UI设计网址吗?  小型网站建站如何选择虚拟主机?  高端建站三要素:定制模板、企业官网与响应式设计优化  宝塔新建站点报错如何解决?  建站之星价格显示格式升级,你的预算足够吗?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何在腾讯云免费申请建站?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何通过cPanel快速搭建网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  建站之星如何修改网站生成路径?  如何选择域名并搭建高效网站?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  小建面朝正北,A点实际方位是否存在偏差?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。