线程池(C++)

news2025/1/11 10:35:38

个人主页:Lei宝啊 

愿所有美好如期而遇


线程池

实现线程类

#pragma once

#include <pthread.h>
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <unistd.h>
#include "sem.hpp"
using namespace std;

class Thread
{
    using func_t = function<void(string)>;

public:
    void Excute()
    {
        _func(_threadname);
    }
public:
    Thread(func_t func, const std::string &name="none-name")
        : _func(func), _threadname(name), _stop(true)
    {}
    static void *threadroutine(void *args) // 类成员函数,形参是有this指针的!!
    {
        Thread *self = static_cast<Thread *>(args);
        self->Excute();
        return nullptr;
    }
    bool Start()
    {
        int n = pthread_create(&_tid, nullptr, threadroutine, this);
        if(!n)
        {
            _stop = false;
            return true;
        }
        else
        {
            return false;
        }
    }
    void Detach()
    {
        if(!_stop)
        {
            pthread_detach(_tid);
        }
    }
    void Join()
    {
        if(!_stop)
        {
            pthread_join(_tid, nullptr);
        }
    }
    std::string name()
    {
        return _threadname;
    }
    void Stop()
    {
        _stop = true;
    }
    ~Thread() {}

private:
    pthread_t _tid;
    std::string _threadname;
    func_t _func;
    bool _stop;
};

任务类

这个就随便写了,用来简单测试。


#include <iostream>
using namespace std;

class Task
{
public:
    void Compare()
    {
        cout << "compare" << endl;
    }

    void operator()()
    {
        Compare();
    }

int a = 1;
int b = 2;

};

线程池类

#include "Thread_pool.hpp"
#include <queue>

const int g_pthreadnum = 6;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

//线程池
template<class T>
class ThreadPool
{
public:
    ThreadPool(int num = g_pthreadnum)
        :pthreadnum(num)
        ,state(false)
        ,waitnum(0)
    {}

    void Everydo(string name)
    {
        while(true)
        {
            Lock();

            while(qtask.empty() && state)
            {
                waitnum++;
                Wait_Pthread();
                waitnum--;
            }

            if(qtask.empty() && !state)
            {
                UnLock();
                cout << name << ": quit" << endl;
                break;
            }

            T task = qtask.front();
            qtask.pop();

            task();

            UnLock();
        }
    }

    bool Push(const T& t)
    {
        Lock();

        bool ret = false;
        if(state)
        {
            qtask.push(t);
            if(waitnum > 0) WakeUp_sigle();

            ret = true;
        }

        UnLock();
        return ret;
    }

    void ThreadInit()
    {
        for(int i=0; i<pthreadnum; i++)
        {
            string name = "pthread-" + to_string(i);
            vthread.emplace_back(bind(&ThreadPool::Everydo, 
            this, placeholders::_1), name);  
            //每个线程都要执行这个方法,这个方法会将任务队列中的任务分配给他们
        }
    }

    void Wait()
    {
        for(auto &e : vthread) e.Join();
    }

    void Quit()
    {
        state = false;
        WakeUp_All();
    }

    void Start()
    {
        state = true;
        for(auto &e : vthread) e.Start();
    }

private:
    //线程池需要什么?线程数量,保存线程的容器
    int pthreadnum;
    vector<Thread> vthread;

    //一个任务队列,创建线程池对象时,线程创建好,我们需要从外部接收任务分配给线程执行
    //我们希望能够接收任意类型的任务,仿函数,函数,lambda表达式等,所以使用模板
    queue<T> qtask;

    //一个状态,控制线程池的退出
    bool state;
    int waitnum;

    void Lock()
    {
        pthread_mutex_lock(&mutex);
    }

    void UnLock()
    {
        pthread_mutex_unlock(&mutex);
    }

    void WakeUp_sigle()
    {
        pthread_cond_signal(&cond);
    }

    void WakeUp_All()
    {
        pthread_cond_broadcast(&cond);
    }

    void Wait_Pthread()
    {
        pthread_cond_wait(&cond, &mutex);
    }
};

测试

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践

目录 前言一、DB-GPT总体概述二、DB-GPT关键特性1、私域问答&数据处理&RAG2、多数据源&GBI3、多模型管理4、自动化微调5、Data-Driven Multi-Agents&Plugins6、隐私安全 三、服务器资源准备1、创建实例2、打开jupyterLab 四、DB-GPT启动1、激活 conda 环境2、切…

【大比武07】人工智能技术赋能城建档案高质量发展

关注我们 - 数字罗塞塔计划 - # 大比武2024 本篇是参加“华夏伟业”杯第二届档案信息化公司业务与技术实力大比武&#xff08;简称“大比武 2024”&#xff09;的投稿文章&#xff0c;来自讯飞知喻&#xff08;安徽&#xff09;科技有限公司&#xff0c;作者&#xff1a;张海剑…

Flask 蓝图路由的模块化开发

基于 Flask 蓝图路由的模块化开发 1. 编程目标 为了提高Flask应用的可维护性和可扩展性&#xff0c;我们通过使用Flask的蓝图(Blueprint)功能&#xff0c;可以将不同的功能模块拆分到独立的文件中&#xff0c;方便后续的开发和维护。 2. 项目结构 项目结构树如下&#xff1…

基于Matlab实现声纹识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 声纹识别&#xff0c;也称为说话人识别&#xff0c;是一种通过声音判别说话人身份的生物识别技…

高效爬取Reddit:C#与RestSharp的完美结合

介绍 在数据驱动的时代&#xff0c;网络爬虫已经成为获取网页数据的重要工具。Reddit&#xff0c;作为全球最大的社区平台之一&#xff0c;以其丰富的用户生成内容、广泛的讨论话题和实时的信息更新吸引了大量用户。对于研究人员和开发者而言&#xff0c;Reddit提供了宝贵的数…

nextcloud 安装部署

php版本不对 ubuntu nginx 配置php 网站-CSDN博客 抄自chatgpt ubuntu完全卸载干净某个包-CSDN博客 以及设置基本的php nginx环境参照上面两篇博文 然后参照官方文档 Example installation on Ubuntu 22.04 LTS — Nextcloud latest Administration Manual latest document…

靶机hackNos Os-Bytesec练习报告

hackNos: Os-Bytesec靶机练习实践报告 下载地址*&#x1f617; https://drive.google.com/open?id1yBuih2CsBx45oTUDpFr4JldrzkaOTTeZ https://download.vulnhub.com/hacknos/Os-ByteSec.ova https://download.vulnhub.com/hacknos/Os-ByteSec.ova.torrent ( Magnet) …

# 分布式链路追踪_skywalking_学习(1)

分布式链路追踪_skywalking_学习&#xff08;1&#xff09; 一、APM 系统概述 1、什么是 APM 系统&#xff1f; APM &#xff1a;全称 Application Performance Management 即应用性能管理系统。是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。…

基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据

背景 随着电子商务和健康产业的迅速发展&#xff0c;药品行业数据的分析和可视化变得愈发重要。基于Django的美团药品数据分析与可视化系统的研究背景凸显了对药品数据的深入挖掘和分析的需求。该系统不仅具备多用户功能&#xff0c;允许不同角色的用户进行数据管理和分析&…

【3DMAX教程插件】3DMAX泰森破碎插件使用方法

3DMAX泰森破碎插件&#xff0c;一键破碎物体&#xff0c;在保留体积的同时破碎网格对象。 【适用版本】 3dMax2009及更高版本 【安装方法】 3DMAX泰森破碎插件无需安装&#xff0c;使用时直接拖动插件脚本文件到3dMax视口中打开即可&#xff01; 【主要功能】 v1.0&#…

气膜建筑的工作原理与优势解析—轻空间

近年来&#xff0c;气膜建筑凭借其独特的结构设计和诸多优点&#xff0c;迅速成为建筑领域的热门选择。本文将详细介绍气膜建筑的工作原理、机械系统、智能控制、索网控制和空气净化等方面&#xff0c;为您提供全面了解气膜建筑的基础知识。 气膜建筑的工作原理 气膜建筑是一种…

翻译《The Old New Thing》- Which windows appear in the Alt+Tab list?

Which windows appear in the AltTab list? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071008-00/?p24863 Raymond Chen 2007年10月08日 有读者Phil Quirk询问&#xff0c;AltTab切换列表中显示哪些窗口的规则是什么。 规则其实相当…

WT2003HX-16S新能源电动汽车低速报警器方案

一&#xff1a;低速报警器应用场景&#xff1a; 为在工业化发展中对外实现弯道超车&#xff0c;其中新能源汽车行业就为国家战略布局方向之一&#xff0c;前景比较广阔。随之配套的各类警报系统方案也蓬勃发展&#xff0c;其中低速报警器&#xff08;AVAS&#xff09;作为关键安…

数字孪生时代来临,实景三维千亿级别市场爆发在即

想象一下&#xff0c;当我们将整座城市搬到虚拟世界&#xff0c;点点鼠标就能实时掌握城市运行情况&#xff0c;可以实现数字空间与现实空间的实时互联互通、在线治理&#xff0c;是不是听起来像科幻电影一样不可思议&#xff1f; 现在&#xff0c;通过运用遥感测绘、大数据、云…

前端项目使用docker编译发版和gitlab-cicd发版方式

项目目录 app/ ├── container/ │ ├── init.sh │ ├── nginx.conf.template ├── src/ ├── .gitlab-ci.yml └── deploy.sh └── Dockerfile └── Makefilecontainer目录是放nginx的配置文件&#xff0c;给nginx镜像使用 .gitlab-ci.yml和Makefile是c…

JetLinks物联网平台初步使用——TCP接入

基于上一篇&#xff0c;完整的搭建了前后端整个系统&#xff0c;可以在windows 7完美的运行使用。 目录 1、创建网络组件 2、创建协议管理 3、创建网关 ​4、创建产品 ​5、创建设备 6、模拟对接 1、创建网络组件 进入平台后&#xff08;用户名密码都是admin&#xff…

【代码随想录】【算法训练营】【第17天】 [110]平衡二叉树 [257]二叉树的所有路径 [404]左叶子之和

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 17&#xff0c;又是一个令人愉快的周五~ 题目详情 [110] 平衡二叉树 题目描述 110 平衡二叉树 解题思路 前提&#xff1a;平衡二叉树&#xff1a;左右子树高度差不超过1, 思路&#xff1a;…

高性能推理框架漫谈

传统模型分布式推理框架 Tensorflow servingPytorch ServingTriton Server 大语言模型的推理框架 其中&#xff0c; VLLM 后端接入了Ray 框架&#xff0c; 作为调度请求的分发处理&#xff1b;除此之外&#xff0c;还包括Nvidia 最新推出的TensorRT-LLM&#xff0c; 增加了对…

开放式耳机怎么选择!教你几招!2024开放式蓝牙耳机推荐

在面对市场上琳琅满目的开放式耳机时&#xff0c;许多用户可能会感到难以抉择。作为一名开放式耳机的爱好者&#xff0c;我根据自己的实际使用体验&#xff0c;整理了一些我认为值得推荐的开放式耳机&#xff0c;希望能为正在寻找合适耳机的朋友们提供一些参考和帮助。我将为大…

【真实项目中收获的提升】- 前后端联调

场景 小型项目前后端联调&#xff0c;不需要部署到sit或uat环境下。 解决方法 后端部署frp服务 下载frp软件 配置frpc.ini文件&#xff0c;先把文件设置可编辑(可同时配置多个 例如下面的chz 上面打码的是frp服务器地址) 然后起start.bat 其实就是执行frpc -c frpc.ini命令…