首页 > 其他分享 >线程池的实现

线程池的实现

时间:2024-04-29 12:23:15浏览次数:23  
标签:std tasks 实现 lock stop 线程 include condition

#include <vector>
#include <thread>
#include <queue>
#include <functional>
#include <mutex>
#include <condition_variable>
#include <iostream>

class ThreadPool {
public:
    ThreadPool(size_t threads) : stop(false) {
        for (size_t i = 0; i < threads; ++i) {
            workerThreads.emplace_back(
                [this] {
                while (true) {
                    std::function<void()> task;

                    {
                        std::unique_lock<std::mutex> lock(this->queueMutex);
                        this->condition.wait(lock,
                            [this] { return this->stop || !this->tasks.empty(); });
                        if (this->stop && this->tasks.empty())
                            return;
                        task = std::move(this->tasks.front());
                        this->tasks.pop();
                    }

                    task();
                }
            }
            );
        }
    }

    template<class F, class... Args>
    void enqueue(F&& f, Args&&... args) {
        auto task = std::bind(std::forward<F>(f), std::forward<Args>(args)...);

        {
            std::unique_lock<std::mutex> lock(queueMutex);
            if (stop)
                throw std::runtime_error("enqueue on stopped ThreadPool");

            tasks.emplace(task);
        }
        condition.notify_one();
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queueMutex);
            stop = true;
        }
        condition.notify_all();
        for (std::thread &worker : workerThreads) {
            worker.join();
        }
    }

private:
    std::vector<std::thread> workerThreads;
    std::queue<std::function<void()>> tasks;

    std::mutex queueMutex;
    std::condition_variable condition;
    bool stop;
};

// 使用例子
void taskFunction(int num) {
    std::cout << "Task " << num << " is running on thread "
        << std::this_thread::get_id() << std::endl;
}

int main() {
    ThreadPool pool(4); // 创建一个有4个线程的线程池
    for (int i = 0; i < 8; ++i) {
        pool.enqueue(taskFunction, i); // 向线程池添加任务
    }
    return 0;
}

 

标签:std,tasks,实现,lock,stop,线程,include,condition
From: https://www.cnblogs.com/wangchenggen/p/18165396

相关文章

  • 爬虫自动化之drissionpage实现随时切换代理ip
    爬虫自动化之drissionpage实现随时切换代理iphttps://blog.csdn.net/qq_32334103/article/details/126133862下载SwitchyOmega地址:https://github.com/FelisCatus/SwitchyOmega/releases  importplatformfromDrissionPageimportChromiumPage,ChromiumOptions......
  • Go-Zero从0到1实现微服务项目开发(二)
    前言书接上回,继续更新GoZero微服务实战系列文章。上一篇被GoZero作者万总点赞了,更文动力倍增,也建议大家先看巧一篇,欢迎粉丝股东们三连支持一波:Go-zero微服务快速入门和最佳实践(一)本文将继续使用Go-zero提供的工具和组件,从零开始逐步构建一个基本的微服务项目。手把手带你完......
  • 只用CSS实现一个自适应的正方形
    问题描述当一个div的宽度是自适应的,高度需要适配宽度的变化一起变化时,CSS的样式设置好像变得不那么容易或许大多数人都会选择js实现,没问题,性能低一点罢了但实际上纯css也能实现代码//html<divclass="container"><divclass="father"><divclass="son">test</div......
  • 实现HTML标签的转义、反转义的几种方法
    原文链接:https://blog.csdn.net/huanggang0101/article/details/99621029方法一:通过正则表达式进行替换1,HTML标签的转义方法//HTML标签转义(<-----><)functionhtml2Escape(sHtml){returnsHtml.replace(/[<>&"]/g,function(c){return{'<':�......
  • 利用AI运动识别插件,可以实现那些应用场景?
    「Ai运动识别」小程序插件已经推出一年有余,迭代了近十几个版本,收获了各类应用场景的众多用户,今天我们就带您深度解析一下插件的各类可应用场景,帮助已集成开发者进行一步拓宽应用场景,帮助有需求的开发者快速选型。在解析应用场前,我们先来回顾一下插件的特点,插件旨在为引用小程序提......
  • Java线程池控制线程存活时间的机制
    核心线程:永不销毁:此类线程处理完任务后,会调用任务队列的take方法,此方法是阻塞的,假如队列为空了,该线程就会被阻塞住,线程就能一直存活着了。非核心线程:空闲指定时间后,会被销毁:此类线程处理完任务后,会通过调用任务队列的pop方法,此方法接收一个时间参数且是限时阻塞的,假如队......
  • Java 线程Dump分析
    一般当服务器挂起,崩溃或者性能低下时,就需要抓取服务器的线程堆栈(ThreadDump)用于后续的分析。在实际运行中,往往一次dump的信息,还不足以确认问题。为了反映线程状态的动态变化,需要接连多次做threaddump,每次间隔10-20s,建议至少产生三次dump信息,如果每次dump都指向同一个问题,我们......
  • Slave SQL线程与PXB FTWRL死锁问题分析
    1.问题背景2.27号凌晨生产环境MySQL备库在执行备份期间出现因FLUSHTABLESWITHREADLOCK未释放导致备库复制延时拉大,慢日志内看持锁接近25分钟未释放。版本:MySQL5.7.21PXB2.4.18慢查询日志:备份脚本中的备份命令:mysql_kill.sh的主要逻辑内容:备份参数:2.问题复......
  • js实现身份证精确校验
    之前我们前端对身份证的校验,都是用的正则校验legalTex=/^\d{6}(18|19|20)\d{2}(0\d|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$/但是这个正则的含义仅仅表示身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X这样的校验是不精确的,你随......
  • 云服务器部署lucky配合frp实现域名访问本地Docker容器
    云服务器部署lucky配合frp实现域名访问DX4600FRP内网穿透可以看我这个帖子:https://www.cnblogs.com/snbg/p/18040720操作流程(配置流程)1.购买一个域名和服务器2.配置云服务器3.部署lucky实现域名访问操作步骤(配置步骤)一、购买一个域名和服务器1.购买一个域名域名购买网站:......