<Linux> 实现简易线程池

文章目录

  • ThreadPool.hpp
  • Thread.hpp
  • LockGuard.hpp
  • Task.hpp
  • test.cc

ThreadPool.hpp

#pragma once
#include <vector>
#include <queue>
#include <iostream>#include "Thread.hpp"
#include "LockGuard.hpp"#define g_threadPool_num 5
template <class T>
class ThreadPool
{
public:bool isEmpty(){return _task_queue.empty();}void waitCond(){pthread_cond_wait(&_cond, &_mtx);}T getTask(){T t = _task_queue.front();_task_queue.pop();return t;}public:ThreadPool(int threadNum = g_threadPool_num): _threads(threadNum){pthread_cond_init(&_cond, nullptr);pthread_mutex_init(&_mtx, nullptr);for (size_t i = 0; i < threadNum; i++){_threads[i] = new Thread(routine, this, i + 1);}}static void *routine(void *args){ThreadData *td = (ThreadData *)args;ThreadPool<T> *tp = (ThreadPool<T> *)td->_args;while (true){T task(-1);{LockGuard lock(&tp->_mtx);while (tp->isEmpty()){tp->waitCond();}task = tp->getTask();}// 仿函数task(td->_name);}return nullptr;}void pushTask(const T &task){LockGuard lock(&_mtx);_task_queue.push(task);pthread_cond_signal(&_cond);}void run(){for (auto &e : _threads){e->start();}}~ThreadPool(){for (auto &e : _threads){e->join();}pthread_cond_destroy(&_cond);pthread_mutex_destroy(&_mtx);}private:std::vector<Thread *> _threads;std::queue<T> _task_queue;pthread_mutex_t _mtx;pthread_cond_t _cond;
};

Thread.hpp

#pragma once
#include <string>
#include <pthread.h>
#include <iostream>
typedef void *(*fun_t)(void *);class ThreadData
{
public:void *_args;std::string _name;pthread_t _tid;fun_t _fun;
};
class Thread
{
public:Thread(fun_t callback, void *args, int num){char nameBuffer[64] = "Thread --- ";sprintf(nameBuffer, "%s%d", nameBuffer, num);_td._name = nameBuffer;_td._args = args;_td._fun = callback;}void start(){pthread_create(&_td._tid, nullptr, _td._fun, &_td);}void join(){pthread_join(_td._tid, nullptr);}public:ThreadData _td;
};

LockGuard.hpp

#pragma once#include <pthread.h>class Mutex
{
public:Mutex(pthread_mutex_t *mtx): _pmtx(mtx){pthread_mutex_init(_pmtx, nullptr);}void lock(){pthread_mutex_lock(_pmtx);}void unlock(){pthread_mutex_unlock(_pmtx);}~Mutex(){pthread_mutex_destroy(_pmtx);}private:pthread_mutex_t *_pmtx;
};class LockGuard
{
public:LockGuard(pthread_mutex_t *mtx): _mtx(mtx){_mtx.lock();}~LockGuard(){_mtx.unlock();}private:Mutex _mtx;
};

Task.hpp

#pragma once
#include <iostream>
class Task
{public:Task(int num): _num(num){}void operator()(const std::string &name){std::cout << name << " 执行" << _num << "任务" << std::endl;}private:int _num;
};

test.cc

#include "ThreadPool.hpp"
#include "Task.hpp"
#include <unistd.h>
int main()
{ThreadPool<Task> tp;tp.run();int index = 0;while (true){Task t(index++);tp.pushTask(t);sleep(1);}return 0;
}

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

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

相关文章

【大数据】—谁是世界上最富的人?

引言 在2024年&#xff0c;全球财富的分布再次成为公众和经济学家关注的焦点。随着经济的波动和新兴市场的崛起&#xff0c;亿万富翁的名单也在不断变化。本文将深入探讨这一现象&#xff0c;通过最新的数据可视化分析&#xff0c;揭示世界上最富有的人在2024年的财富状况和趋…

达梦数据库的系统视图v$session

达梦数据库的系统视图v$session 在达梦数据库中&#xff0c;V$SESSION 系统视图类似于Oracle中的V$SESSION视图&#xff0c;提供有关当前数据库会话的信息。以下是有关达梦数据库 V$SESSION 系统视图的详细说明&#xff1a; V$SESSION 视图 V$SESSION视图提供了关于当前活动…

leetcode02.05-链表求和

两个链表相加 给定两个用链表表示的整数&#xff0c;每个节点包含一个数位。 这些数位是反向存放的&#xff0c;也就是个位排在链表首部。 输入&#xff1a;(7 -> 1 -> 6) (5 -> 9 -> 2)&#xff0c;即617 295 输出&#xff1a;2 -> 1 -> 9&#xff0c;即…

解锁品牌推广小妙招:如何高效塑造品牌影响力

在信息化大时代&#xff0c;企业如何做好品牌传播是一个复杂而重要的课题。随着信息爆炸和新媒体的兴起&#xff0c;传统的广告投放已经无法完全满足品牌的宣传需求&#xff0c;媒体公关传播越来越为企业所重视。今天投媒网就来与您分享在信息化大时代&#xff0c;企业如何做好…

理解Java中的死锁(Deadlock)及其示例

目录 背景: 示例代码: 类定义与变量声明&#xff1a; run方法&#xff1a; main方法 &#xff1a; 死锁示例解释&#xff1a; 总结: 背景: 在Java多线程编程中&#xff0c;死锁&#xff08;Deadlock&#xff09;是一个必须警惕和避免的问题。当两个或更多的线程在相互等…

在Mandelbrot 集中“缩放”特定区域

1、问题背景 在创建一个快速生成 Mandelbrot 集图像的 Python 程序时&#xff0c;程序开发者遇到一个问题&#xff1a;他想要渲染该集合的一个特定区域&#xff0c;但他不知道如何修改代码中的数学部分来实现 “缩放”。 2、解决方案 第一种解决方案 问题根源是代码中的一行…

SVN学习(007 svn安装Tortoise工具)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第58p-第p72的内容 介绍 安装 选择自己想要装软件的文件夹 进入工作目录&#xff0c;发现无svn的图标&#xff0c;重启电脑即可 就能看到svn的图标 settings功能 进行图标的查看 修改subversion配置文件 …

安卓直装植物大战僵尸杂交版V2.1版完美运行

在移动游戏的世界里&#xff0c;植物大战僵尸无疑是一款深受玩家喜爱的经典游戏。如今&#xff0c;随着技术的发展和玩家需求的变化&#xff0c;植物大战僵尸杂交版V2.1版应运而生&#xff0c;为安卓用户带来了全新的游戏体验。 这一全新版本在原有游戏的基础上进行了多项创新…

SAP系统中的应付账款(与MM集成,关账操作)

1. 与物料管理的集成 Plant: 工厂是后勤中的位于中心位置的组织对象&#xff0c;一个“工厂”可以是公司内的一个作业区&#xff0c;或一个分支机构。一个“工厂”可以是一个中央交付仓库&#xff0c;可以是一个区域的销售营业部&#xff0c;一个制造工厂&#xff0c;一个集团…

java 反射介绍

Java 反射机制是一种强大的工具,它允许程序在运行时动态地获取有关类、接口、方法和字段的信息,以及动态调用方法和构造函数、访问字段。反射是 Java 提供的一种功能强大的编程工具,广泛用于框架、工具库和其他需要动态处理类型信息的场景。 反射的常用操作 1. 获取类名:…

合适的智能猫砂盆到底怎么挑?开放式封闭式一次说清!

想当初我也是在网上看了各种测评&#xff0c;纠结了好久才下定决心入手了智能猫砂盆。封闭式和开放式都用过&#xff0c;各有各的利与弊&#xff0c;不过最后的我还是选择了开放式的智能猫砂盆&#xff0c;因为开放式的设计结构会更加方便我观察小猫&#xff0c;哪个铲屎官不喜…

采购OLED透明屏指南

一、引言 OLED透明屏作为一种前沿的显示技术&#xff0c;以其独特的透明度和出色的显示效果&#xff0c;受到了众多行业的青睐。在采购OLED透明屏时&#xff0c;需要综合考虑多个因素&#xff0c;以确保选择到符合需求的高质量产品。以下是一份详细的采购OLED透明屏指南&#x…

《云南化工》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《云南化工》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《云南化工》级别&#xff1f; 答&#xff1a;省级。主办单位&#xff1a;云天化集团有限责任公司 主管单位&#xff1a;…

让我们聊聊网络安全中会涉及到的IP地址(IP协议)、MAC地址、路由、DNS协议(域名系统)、NAT技术(协议)、以太网帧、ARP协议

网络安全中会涉及到的IP地址&#xff08;IP协议&#xff09;、MAC地址、路由、DNS协议&#xff08;域名系统&#xff09;、NAT技术&#xff08;协议&#xff09;、以太网帧、ARP协议 一.IP地址&#xff08;IP协议&#xff09;1.IP地址&#xff08;IP协议&#xff09;的作用2.IP…

小山菌_代码随想录算法训练营第三十四天| 56. 合并区间、

56. 合并区间 文档讲解&#xff1a;代码随想录.合并区间 视频讲解&#xff1a;贪心算法&#xff0c;合并区间有细节&#xff01;LeetCode&#xff1a;56.合并区间 状态&#xff1a;已完成 代码实现 class Solution { public:vector<vector<int>> merge(vector<…

Go 实现SFTP连接服务

我们将SFTP连接和处理逻辑&#xff0c;以及登录账户信息封装&#xff0c;这样可以在不同的地方重用代码&#xff0c;并且可以轻松地更改登录凭据。下面我将演示如何使用Go语言中的结构体来封装这些信息&#xff0c;并实现一个简单的SFTP服务器&#xff1a; package mainimport…

配置Nginx 在服务器重启后自动启动

记录一下&#xff0c;配置Nginx 在服务器重启后自动启动&#xff0c;可以通过配置 systemd 服务来实现。以下是具体步骤&#xff1a; 检查 Nginx 服务的状态&#xff1a; 先确认 Nginx 是否已经安装并且可以通过 systemctl 管理&#xff1a; sudo systemctl status nginx如果…

大厂薪资福利篇第五弹:小红书

欢迎来到绝命Coding&#xff01; 今天继续更新大家最关心的 大厂薪资福利系列&#xff01; 为什么计算机学子对大厂趋之若鹜呢&#xff1f;最直接的原因就是高薪资的吸引力。 • 但是薪资可不是简单的数字哦&#xff0c;里面还是有很多“学问”的。 • 很多同学对大厂薪资只有一…

《黑神话悟空》电脑配置要求

《黑神话&#xff1a;悟空》这款国内优秀的3A游戏大作&#xff0c;拥有顶级的特效与故事剧情&#xff0c;自公布以来便备受玩家期待&#xff0c;其精美的画面与流畅的战斗体验&#xff0c;对玩家的电脑配置提出一定要求。那么这款优秀的游戏需要什么样的电脑配置&#xff0c;才…

老板舍不得买库存管理软件❓一招解决

在当今快节奏的商业环境中&#xff0c;仓库管理是企业运作中不可或缺的一环。对于许多中小型企业而言&#xff0c;简易且高效的库存管理系统尤为重要。搭贝简易库存管理系统针对仓库的出入库进行有效管理&#xff0c;帮助企业实现库存的透明化和流程的自动化。 客户的痛点 1. …