线程池(C++)

个人主页: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);
    }
};

测试

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Transformer系列专题(一)——self-attention自注意力机制如何计算

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、总述二、如何计算self-attention三、softmax归一处理Attention整体计算流程 前言 自注意力机制的原理相当于一个词在其上下文中的联系&#xff0c;即将这一…

linux-----环境变量

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 常见的环境变量&#xff1a; PWD&#xff1a;记录当前工作目录 PATH : 指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的…

毫米波雷达深度学习方法和技术-概述

深度学习方法和技术—在毫米波雷达解决方案的进展 前言 雷达已经从复杂的高端军事技术演变为相对简单的低端解决方案&#xff0c;渗透到工业、汽车和消费市场领域。这种快速发展是由硅的进步和使用深度学习算法来利用传感器数据的全部潜力所驱动的。雷达传感器的使用已经增长了…

Visual Studio 下的Qt工程无法打开 “xxx.ui“ 文件和LNK1104 无法打开文件“Qt5Cored.lib”错误

一、问题&#xff1a; VS下Qt环境准备好后&#xff0c;创建了Qt工程然后点击 Form Files 下的 “xxx.ui” 文件&#xff0c;在弹出 Qt 设计师 界面后闪退并显示如下错误&#xff1a; 二、解决 1、工具栏处依次点击&#xff1a;扩展 一> Qt VS Tools 一> options 弹出选…

windows2008修改远程桌面端口,如何果断修改远程桌面端口,确保系统安全无忧!

在数字化时代的浪潮中&#xff0c;Windows 2008系统以其卓越的稳定性和可靠性&#xff0c;赢得了众多企业和个人的青睐。然而&#xff0c;随着网络安全问题的日益严峻&#xff0c;如何确保远程桌面连接的安全&#xff0c;成为了摆在我们面前的一道难题。今天&#xff0c;我将为…

【HMGD】STM32/GD32 I2C DMA 主从通信

STM32 I2C配置 主机配置 主机只要配置速度就行 从机配置 从机配置相同速度&#xff0c;可以设置第二地址 因为我的板子上面已经有了上拉电阻&#xff0c;所以可以直接通信 STM32 I2C DMA 定长主从通信代码示例 int state 0; static uint8_t I2C_recvBuf[10] {0}; stat…

Python图像处理:从基础到高级的全方位指南

目录 第一部分&#xff1a;Python图像处理基础 1.1 图像处理概念 1.2 Python图像处理常用库 1.3 实战案例&#xff1a;图像显示与保存 1.4 注意事项 第二部分&#xff1a;Python图像处理高级技巧 2.1 图像变换 2.2 图像增强 2.3 图像复原 第三部分&#xff1a;Python…

注意力机制,代码简析

2017年Google在论文《Attention is All You Need》中提出了Transformer模型&#xff0c;并成功应用到NLP领域。该模型完全基于自注意力机制Attention mechanism实现&#xff0c;弥补了传统的RNN模型的不足。宏观层面&#xff0c;Transformer可以看成是一个黑箱操作的序列到序列…

SpringCloud Alibaba的相关组件的简介及其使用

Spring Cloud Alibaba是阿里巴巴为开发者提供的一套微服务解决方案&#xff0c;它基于Spring Cloud项目&#xff0c;提供了一系列功能强大的组件&#xff0c;包括服务注册与发现、配置中心、熔断与限流、消息队列等。 本文将对Spring Cloud Alibaba的相关组件进行简介&#xff…

Unity3D读取Excel表格写入Excel表格

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、读取Excel表格&#x1f449;二、写入Excel表格&#x1f449;三、Fileinfo和Directoryinfo的操作&#x1f449;四、壁纸分享&#x1f449;总结 &#x1f449;前言 有时候难免会遇到读取文件写…

【实验内容-1】自定义异常类的应用

目录 【任务介绍】 【任务目标】 【任务分析】见具体任务介绍 【任务实现】 【实验结果&#xff08;包括输入数据和输出结果&#xff09;】 【任务介绍】 1.写一个抽象类&#xff1a;账户类(Account) 包含属性: id:账户号码 name:账户姓名 balance:账户余额 deposit…

基于Matlab实现声纹识别系统

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

线段(线性dp)

题目链接&#xff1a;[TJOI2007] 线段 - 洛谷 思路&#xff1a; f[i][0]表示走完第i行且停在第i行的左端点最少用的步数 f[i][1]同理&#xff0c;停在右端点的最少步数。 那么转移就很简单了&#xff0c;走完当前行且停到左端点&#xff0c;那么一定是从右端点过来的&#x…

“腾讯云 AI 代码助手”体验

一、“腾讯云 AI 代码助手”体验 1、注册账号并进行实名认证 2、进入开发环境 3、体验javascript简单函数 代码如下&#xff1a; //请写一个两个日期计算的函数 function dateDiff(date1, date2) {return date2.getTime() - date1.getTime(); } var date1 new Date("2…

Elastic Cloud Serverless 定价和打包

作者&#xff1a;来自 Elastic Clint Scott 借助 Elastic Cloud Serverless&#xff0c;我们通过针对安全性、可观察性和 Elasticsearch 的新解决方案特定定价和打包来简化并提供更高的灵活性。 Elastic Cloud 定价的演变 Elastic Cloud 长期以来一直是使用 Elastic Stack 的最…

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

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

【leetcode】排序算法总结

第 11 章 排序 - Hello 算法动画图解、一键运行的数据结构与算法教程https://www.hello-algo.com/chapter_sorting/ 堆排序 #include <iostream> #include <vector>using namespace std;/* 堆的长度为 len &#xff0c;从节点 i 开始&#xff0c;从顶至底堆化 *…

【vue部署】Apache部署vue项目

Apache部署vue项目 Apache 下载安装(windows)1. 下载2. 安装3. 启动服务 vue 部署配置1. 基础配置2. 解决页面刷新问题 Apache 下载安装(windows) 1. 下载 Apache 2.4.59 下载地址&#xff1a;httpd-2.4.59-240404-win64-VS17.zip Visual C Redistributable for Visual Studi…

Python解析网页-XPath

目录 1、什么是XPath 2、安装配置 3、XPath常用规则 4、快速入门 5、浏览器XPath工具 1.什么是XPath XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位和选择节点的语言。 它是W3C&#xff08;World Wide Web Consortium&#xff09;定义的一种标…

Springboot+Element_分页+显示+搜索+完整版

目录 显示效果 新建项目时选择的依赖 文件的目录结构 一、准备工作 1、配置文件 2、pom增加PageHelper 3、在idea中建立数据库连接&#xff0c; 4、新建peom表&#xff08;如已建好&#xff0c;则忽略本条&#xff09; 二、新建前端页面index.html&#xff08;未连后端…