C++11线程池

本文介绍如何使用C++11标准库构建线程池,包括Runnable类、Thread类、BlockingQueue、ThreadPoolExecutor等核心组件。通过实例展示了线程池的创建和任务提交过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CPP11线程池

前言

C++11新添加了多线程库,但是却没有线程池,而且线程功能不完整.没有线程终止,状态判断等函数.当然C++委员会有自己的考虑.比如线程突然终止资源泄漏或内存泄漏问题.利用C++ thread实现线程池还是有一定难度的.这里参考Java的Executor和C++并发编程实战.真正的代码比较长,放在了github上.线程池代码地址

要实现的组件

  1. Runnable类,可以通过重载operator()执行任务
  2. Thread类,封装std::thread,提供命名join()等操作
  3. BlockingQueue存储任务
  4. ThreadPoolExecutor基本线程池(自动调整大小)
  5. workStealingThreadPool任务窃取线程池(未完成)
  6. ScheduledThreadPool定时调度线程池(未完成)

例子

#include <iostream>
#include <chrono>
#include "runnable.hpp"
#include "threadpool.hpp"

class R: public Runnable {
    public:
        virtual void operator()() {
            std::this_thread::sleep_for(std::chrono::seconds(2));
            std::cout << name  << std::this_thread::get_id() << std::endl;
        }

    private:
        std::string name = "RRRRRRRRRRRRRRRRRRRRR";
};

int main(void)
{
    R r1, r2;

    ThreadPoolExecutor tpe(1, 5);
    for (int i = 0; i < 1; ++i) {
        //submit可以有返回值(std::future)
        tpe.submit(r1);
        tpe.submit([]() {
            std::this_thread::sleep_for(std::chrono::seconds(2));
            std::cout << std::this_thread::get_id() << std::endl;
        });
    }

    //std::this_thread::sleep_for(std::chrono::seconds(1));
    tpe.releaseIdleWorkers();
    //std::this_thread::sleep_for(std::chrono::seconds(1));

    tpe.submit([]() {
        std::this_thread::sleep_for(std::chrono::seconds(2));
        std::cout << std::this_thread::get_id() << std::endl;
    });

    //tpe.stop();
    std::this_thread::sleep_for(std::chrono::seconds(3));
    std::cout << tpe.toString() << std::endl;
    return 0;
}

源码截图

在这里插入图片描述
在这里插入图片描述

源码地址

https://github.com/yzz-ihep/CXX11ThreadPool
代码会不定期更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值