Linux-线程池

devtools/2024/12/5 7:20:37/

文章目录

  • 前言
  • 一、线程池是什么?
  • 二、示例代码


前言

线程池主要是对之前内容的一个巩固,并且初步了解池化概念。


一、线程池是什么?

线程池就是提前开辟好一块空间,随时准备创造新线程来完成任务,可以理解为用空间来换时间,具体实现看以下示例代码。

二、示例代码

#include <pthread.h>
#include <cstdio>
#include <cstdlib>
#include "lockGuard.hpp"
#include "log.hpp"
const int default_ThreadNum = 5;
template <class T>
class ThreadPool
{public:ThreadPool(int thread_num = default_ThreadNum):_thread_num(thread_num){pthread_mutex_init(&_mutex,nullptr);pthread_cond_init(&_cond,nullptr);for (int i = 1; i <= _thread_num; i++){char nameBuffer[128];snprintf(nameBuffer, sizeof nameBuffer, "Thread %d", i);_threadPool.push_back(new Thread(nameBuffer, routine, (void *)this));logMessage(NORMAL, "%s 线程创建成功!", nameBuffer);}}bool isEmpty(){return _task_queue.empty();}void waitCond(){pthread_cond_wait(&_cond, &_mutex);}pthread_mutex_t &getMutex(){return _mutex;}T getTask(){T task = _task_queue.front();_task_queue.pop();return task;}std::vector<Thread> &getpool(){return _threadPool;}static void *routine(void *args){ThreadData *td = (ThreadData *)args;ThreadPool<T> *tp = (ThreadPool<T> *)td->_args;while (1){T task;{lockGuard lg(&tp->getMutex());while (tp->isEmpty())tp->waitCond();task = tp->getTask();}task(td->_name);}}void run(){for(auto& thread : _threadPool){thread->start();}}void pushTask(const T &task){lockGuard lg(&_mutex);_task_queue.push(task);pthread_cond_signal(&_cond);}~ThreadPool(){for(auto& iter: _threadPool){iter->join();delete iter;}pthread_mutex_destroy(&_mutex);pthread_cond_destroy(&_cond);}private:int _thread_num;std::vector<Thread*> _threadPool;std::queue<T> _task_queue;pthread_mutex_t _mutex;pthread_cond_t _cond;
};


http://www.ppmy.cn/devtools/43915.html

相关文章

2024.5.23 作业 xyt

今日课堂内容&#xff1a;超时检测 数据库 select函数 #include <myhead.h> int main(int argc, const char *argv[]) {//1、定义检测容器fd_set readfds;//2、清空内容FD_ZERO(&readfds);//3、将文件描述符放入集合中FD_SET(0, &readfds);//4、定义超时时间变…

移动端开发 笔记02

目录 01 媒体查询 02 rem 和 em 单位的使用 03 css 预处理语言 04 布局容器 05 栅格系统 01 媒体查询 主要作用&#xff1a; 能够检测不同的媒体设备以及媒体类型和尺寸大小从而生效不同的出css代码 实现响应式效果 语法格式&#xff1a; media 媒体规则 媒体类型 and(媒体…

「Element-UI表头添加带Icon的提示信息」

一、封装全局组件 &#x1f353; 注意&#xff1a;可以直接复制该文件 <!-- // 写一个PromptMessage的组件&#xff0c;并全局注册 --> <template><div class"tooltip"><el-tooltip effect"dark" placement"right">&l…

常见Windows命令汇总

1.打开命令提示符或PowerShell&#xff1a; cmd&#xff1a;打开命令提示符。 powershell&#xff1a;打开PowerShell。 2.文件和目录操作&#xff1a; cd&#xff1a;更改当前目录。例如&#xff0c;cd C:\Users\Username\Documents 将当前目录更改为 "Documents" …

全球首例光伏电场网络攻击事件曝光

快速增长的光伏发电正面临日益严重的网络安全威胁。近日&#xff0c;日媒报道了首个针对光伏电场的网络攻击事件。 首例公开确认的光伏电网攻击 日本媒体《产经新闻》近日报道&#xff0c;黑客劫持了一个大型光伏电网中的800台远程监控设备(由工控电子制造商Contec生产的Solar…

研发设计管理、研发设计管理系统有哪些

研发设计管理系统种类繁多&#xff0c;每种系统都有其特定的功能和用途。以下是一些常见的研发设计管理系统及其主要功能&#xff1a; PLM&#xff08;产品生命周期管理&#xff09;研发管理系统&#xff1a; 功能&#xff1a;管理产品从概念、设计、开发、制造、销售到维护的…

Redis连接池

本次实现的Redis连接池是一个单例且多线程安全的连接池。 主要实现的功能为&#xff1a;读取配置&#xff0c;将配置中对应建立redis连接并加入到连接池中&#xff0c;然后从连接池中取出连接使用。每当配置进行修改&#xff0c;重新往池子中加入连接。 通用类 实现一些基础都…

Web Accessibility基础:构建无障碍的前端应用

Web Accessibility&#xff08;网络无障碍&#xff09;是确保所有人都能平等访问和使用网站和应用程序的关键。这包括视觉、听觉、运动和认知能力有限的用户。以下是一些构建无障碍前端应用的基础原则和代码示例&#xff1a; 2500G计算机入门到高级架构师开发资料超级大礼包免…