线程池(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);}
};

测试

 

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

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

相关文章

Python深度学习基于Tensorflow(12)实战生成式模型

文章目录 Deep Dream风格迁移参考资料 Deep Dream DeepDream 是一项将神经网络学习模式予以可视化展现的实验。与孩子们观察云朵并尝试解释随机形状相类似&#xff0c;DeepDream 会过度解释并增强其在图像中看到的图案。 DeepDream为了说明CNN学习到的各特征的意义&#xff0c…

「51媒体」线下活动媒体同步直播,云分发,分流直播

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 线下活动除了邀请嘉宾&#xff0c;邀请媒体&#xff0c;邀请行业大咖KOL&#xff0c;来为活动站台&#xff0c;背书外&#xff0c;我们也可以将线下的活动同步在线上进行直播&#xff0c…

react【框架原理详解】JSX 的本质、SyntheticEvent 合成事件机制、组件渲染过程、组件更新过程

JSX 的本质 JSX 代码本身并不是 HTML&#xff0c;也不是 Javascript&#xff0c;在渲染页面前&#xff0c;需先通过解析工具&#xff08;如babel&#xff09;解析之后才能在浏览器中运行。 babel官网可查看 JSX 解析后的效果 更早之前&#xff0c;Babel 会把 JSX 转译成一个 R…

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、切…

区块链fisco联盟链搭建(二)搭建多群组联盟链

本文章只讲搭建的命令方法 以单机、四机构、三群组、八节点的星形组网拓扑为例 第一步创建并进入工作目录&#xff08;继续以fisco为例&#xff09; mkdir /fisco cd /fisco 获取搭链脚本上一篇文章区块链fisco联盟链搭建 (一)搭建单群组四节点联盟链中有 第二步生成多群组…

抖音小店没有流量不出单?归根到底,就是转化率不行!

哈喽~我是电商月月 新手做抖音小店&#xff0c;最忧愁的就是&#xff1a;店铺不出单怎么办&#xff1f; 商家通常会把没有销量的原因&#xff0c;都推向于“店铺没有流量” 但在抖音&#xff0c;这个日活量高达9亿的平台来说&#xff0c;任何商铺最不缺的应该就是流量了 但…

dll文件是什么?电脑丢失某个dll文件有什么解决办法

Dll文件是什么&#xff1f;这个文件在电脑中是什么样的地位&#xff1f;如果电脑提示丢失了某个dll文件那么有什么办的解决这个问题呢&#xff1f;如何将丢失的dll文件进行修复呢&#xff1f;今天这篇文章将按就来教大家几种修复丢失dll文件问题的方法。 DLL 文件&#xff0c;全…

[Redis]基本全局命令

Redis存储方式介绍 在 Redis 中数据是以键值对的凡事存储的&#xff0c;键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;是基本的数据存储单元。以下是对 Redis 键值对的详细讲解&#xff1a; 键&#xff08;Key&#xff09;&#xff1a; 类型&#xff1a;…

全局配置路径无法识别的解决——后端

在全局配置路径reggie.path的时候&#xff0c;无法正常启动SpringBoot项目 Value("${reggie.path}")private String basePath; 查看application.yml的配置情况: 发现path没有起作用&#xff0c;推测是格式问题&#xff0c;冒号后面空格后即可

Web API——获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标&#xff1a;能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法&#xff1a; document.querySelector(css选择…

第19讲:自定义类型:结构体

目录 1.结构体类型的声明1.1 结构体回顾1.1.1 结构的声明 特殊的结构声明1.3 结构的⾃引⽤ 2. 结构体内存的对齐2.2 为什么存在内存对⻬?2.3 修改默认对⻬数 3. 结构体传参4. 结构体实现位段4.1 什么是位段4.2 位段的内存分配4.3 位段的跨平台问题4.5 位段使⽤的注意事项 正文…

梳理 JavaScript 中空数组调用 every方法返回true 带来惊讶的问题

前言 人生总是在意外之中. 情况大概是这样的. 前两天版本上线以后, 无意中发现了一个bug, 虽然不是很大, 为了不让用户使用时感觉到问题. 还是对着一个小小的bug进行了修复, 并重新在上线一次, 虽然问题不大, 但带来的时间成本还是存在的. 以及上线后用户体验并不是很好. 问题…

JVM学习-垃圾收集器(二)

Serial回收器&#xff1a;串行回收 Serial收集器是最基本、历史最悠久的收集器JDK1.3之前新生代唯一的选择Hotpot中Client模式下的默认新生代垃圾收集器采用复制算法&#xff0c;串行回收“Stop-the-world”机制的方式执行内存回收除了年轻代之外&#xff0c;Serial收集器还提…

TG-5006CG温补晶振在WiFi6无线路由器模块的应用

WiFi6无线路由器是采用了wiFi6技术的无线网络设备&#xff0c;旨在为家庭、办公室或其他场所提供高速、稳定的无线网络连接。它不仅能实现更高的数据传输速率和更低的延迟&#xff0c;还提供了更先进的加密和安全措施&#xff0c;确保用户数据安全。为了支持这些高级功能&#…

深入 Rust 标准库,Rust标准库源代码系统分析

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

Elasticsearch集群部署以及认证配置

文档地址&#xff1a; 官网文档地址&#xff1a; https://www.elastic.co/guide/index.html rpm包/源码下载地址&#xff1a;https://www.elastic.co/cn/downloads 源码安装-环境准备&#xff1a; node-01 192.168.95.174 node-02 192.168.95.173 node-03 …

【uniapp】CSS实现多行文本展开收起的文字环绕效果

1. 效果图 收起状态 展开状态 2. 代码实现 <view class"word-wrap" id"descriptionTxt"><view class"fold-text" v-if"isFold"><text class"fold-btn" click"changFold">全文</text&g…

使用docker完整搭建前后端分离项目

1、docker的优势&#xff0c;为啥用docker 2、docker的核心概念 镜像【Image】- 只读模板 容器【Container】- 运行镜像的一个外壳&#xff0c;相当于一个独立的虚拟机 仓库【repository】- 镜像的管理工具&#xff0c;可公开&#xff0c;可私有&#xff1b;类似git仓库 3、c…

操作教程|通过DataEase开源BI工具对接金山多维表格

前言 金山多维表格是企业数据处理分析经常会用到的一款数据表格工具&#xff0c;它能够将企业数据以统一的列格式整齐地汇总至其中。DataEase开源数据可视化分析工具可以与金山多维表格对接&#xff0c;方便企业更加快捷地以金山多维表格为数据源&#xff0c;制作出可以实时更…

包拯断案 | MySQL5.7替换路上踩过的坑 一键get解决办法@还故障一个真相

提问&#xff1a;作为DBA运维的你&#xff0c;是否有过这些烦恼 1、业务系统进行替换投产时&#xff0c;发现数据库回放并行度低 2、虽然2个数据库集群使用同一份数据&#xff0c;却在关闭双一后&#xff0c;二级从库的回放效率依旧缓慢&#xff0c;不知是什么原因&#xff1f…