基于C++写一个线程池

C++—线程池(附源代码) std::atomic 提供了原子操作,适用于需要在多线程环境中进行无锁操作的场景。std::atomic_flag 用于实现低级别的锁机制,如自旋锁。了解内存序是使用原子操作时的一个重要方面,它帮助你控制操作的顺序和可见性,从而确保程序的正确性和效率。 阅读详情

线程池的设计大致需要包含这几部分:
线程请求队列(存放业务请求)、
工作线程(进行业务处理)、
线程同步模块(互斥量、信号量)
以及操作请求队列的接口(append)。
下面代码封装了一个简易的线程池,采用模板类进行实现

template<class T>
class threadpool
{
public:                                                                                                        
    //max_requests 请求队列中最多允许的、等待处理的请求的数量
    threadpool(Pool* connPool, int threadnum = 8, int max_request = 10000);
    ~threadpool();
    bool append_p(T* request); 	        //将事件放入请求队列

private:
    //工作线程函数, 不断从工作队列里面取任务
    static void* worker(void* arg);     //取任务, 调用run
    void run();  					    //执行任务

private:
    int m_thread_number; //线程池大小
    int m_max_requests;  //请求队列中允许的最大请求数量
    pthread_t* m_threads; //线程变量数组
    std::list<T*> m_workqueue; //请求队列
    locker m_queuelocker;  //保护请求队列
    sem m_queuestat;   //请求队列中的请求数信号量
    Pool* m_connPool;  //数据库连接
};  

具体实现:

template<class T>
threadpool<T>::threadpool(Pool* connPool, int threadnum, int max_request)
                         :m_connPool(connPool), m_thread_number(threadnum),
                          m_max_requests(max_request),m_threads(nullptr)
{
    if(threadnum <= 0 || max_request <= 0){
        throw std::exception();
    }
    m_threads = new pthread_t[m_thread_number]; //创建线程变量
    if(m_threads == nullptr){
        throw std::exception();
    }
    //接下来建立线程池
    for(int i = 0; i < m_thread_number; ++i){
        if(pthread_create(m_threads + i, NULL, worker, this) != 0){
            delete []m_threads; 
            throw std::exception();
        }
        if(pthread_detach(m_threads[i]) != 0){
            //使用detach分离线程, 该线程结束后资源自动回收, 无需join
            delete []m_threads;
            throw std::exception();
        }
    }
}

template<class T>
threadpool<T>::~threadpool(){
    //销毁线程池
    delete []m_threads;
}

template<class T>
bool threadpool<T>::append_p(T* request){
    m_queuelocker.lock();
    
    if(m_workqueue.size() >= m_max_requests){
        //请求队列已满
        m_queuelocker.unlock();
        return false;
    }
    m_workqueue.push_back(request); //将请求放入请求队列
    m_queuelocker.unlock();
    m_queuestat.post(); 		    //信号量+1
    return true;
}

template<class T>
void* threadpool<T>::worker(void* arg){
    threadpool* pool = (threadpool*)arg;
    pool->run();  //执行任务
    return pool;
}

template<class T>
void threadpool<T>::run(){
    while(true){
        m_queuestat.wait(); //如果无请求需要处理,阻塞在这里
        m_queuelocker.lock();
        if(m_workqueue.empty()){
            //没有任务可处理
            m_queuelocker.unlock();
            continue;
        }
        T* request = m_workqueue.front(); //取任务
        m_workqueue.pop_front();
        m_queuelocker.unlock(); 		  //下面不再操作共享任务队列, 解锁
        
        //下面就是进行业务的处理,可根据实际需求进行填补
}

同步机制实现:

class locker
{
public:
    locker(){
        if(pthread_mutex_init(&mtx, nullptr) != 0){
            throw std::exception();
        }
    }
    ~locker(){
        pthread_mutex_destroy(&mtx);
    }
    bool lock(){
        return pthread_mutex_lock(&mtx) == 0;
    }
    bool unlock(){
        return pthread_mutex_unlock(&mtx) == 0;
    }
    pthread_mutex_t* GetMtx(){ //获取一把锁
        return &mtx;
    }
private:
    pthread_mutex_t mtx;
};

class sem
{
public:
    sem(int num){
        if(sem_init(&id, 0, num) != 0){  //线程共享
            throw std::exception();  
        }
    }
    sem(){
        if(sem_init(&id, 0, 0) != 0){
            throw std::exception();
        }
    }
    ~sem(){
        sem_destroy(&id);
    }
    bool wait(){
        return sem_wait(&id) == 0;
    }
    bool post(){
        return sem_post(&id) == 0;
    }
private:
    sem_t id;
};

分享一个C++11写的线程池 上一篇博客讲述了一些线程池的知识。但是C++11让线程变得更加简单,关于C++11线程方面的知识之前也有过介绍。今天就介绍一个使用C++11写的简单的一个线程池,thread pool.github地址: https://github.com/progschj/ThreadPool首先看看线程池怎么写的:#ifndef THREAD_POOL_H #define THREAD_POOL_H#inc 阅读详情

相关推荐

使用C++ 11特性写一个简单的线程池

#ifndef THREAD_POOL_H #define THREAD_POOL_H#include <vector> #include <queue> #include <memory> #include <thread> #include <mutex> #include <condition_variable> #include <future> #include <functional>

xjtuse2014的博客 1711

C++线程池

C++线程池

weixin_45144862的博客 2万+

地图坐标系大全:常用地图坐标系详解与转换指南

地图坐标系是用于描述地图上位置的数学模型。它可以用来表示地球表面上的任意一个点,使得这个点的位置可以在地图上精确定位。不同的地图坐标系采用不同的基准面和投影方式,因此会有不同的坐标系参数,不同的坐标系之间也需要进行坐标转换。在地图制图、导航、GIS等领域中,地图坐标系是一个非常重要的概念。

weixin_39888010的博客 1万+

C++ 线程池

2019-05-17 20:16:52 原文链接 C++线程池 参考链接: 基于C++11实现线程池的工作原理;c++简单线程池实现 基础概念 线程池: 当进行并行的任务作业操作时,线程的建立与销毁的开销是,阻碍性能进步的关键,因此线程池,由此产生。使用多个线程,无限制循环等待队列,进行计算和操作。帮助快速降低和减少性能损耗。 线程池的组成 线程池管理器:初始化和创建线程,启动和停止线程,调...

qq_34771252的博客 2万+

Matlab系列之GUI设计基础

Matlab系列之GUI设计基础简介编辑界面菜单设计控件设计控件描述个人理解Matlab转译控件属性【1】外观与行为【2】控件对象的信息【3】回调函数【4】状态信息结束结束更多精彩,等你发现~ 简介 GUI即图形用户界面(Graphical User Interface),人机交互的一种方式,可以简化用户的操作,比如只需要点点窗口上的按键或者菜单选择等等,就可以实现一个复杂的功能,有点类似黑盒的操作吧。 本篇将主要介绍GUI的使用,以及一些功能,后续的篇章再使用GUI来设计实例。 打开GUI可以在Matla

Smart_Devil的博客 5万+

基于Yolo11的无人机小目标检测系统的设计与性能优化改进项目实现

该项目旨在开发一个基于YOLO11的无人机目标检测系统,能够实时识别并定位无人机拍摄过程中捕捉的小目标。考虑到无人机拍摄的目标通常较小,系统将采用特定的调优策略,以提高小目标的检测精度和召回率。

m0_73723097的博客 1205

C++写一个线程池

这次换成C++了!由于C++支持泛型编程,所以代码的灵活性提高了不知道多少倍!!!!!

Royi的学习博客 1966

用Arduino和RC522模块DIY一个NFC门禁卡复制器(附完整代码)

本文详细介绍了如何利用Arduino和RC522模块DIY一个NFC门禁卡复制器,包括硬件连接、软件配置、数据读写技术及完整代码实现。通过本教程,电子爱好者可以深入了解NFC技术,并构建自己的智能门禁系统,适用于家庭安全、办公场所等多种场景。

weixin_33704591的博客 497

C++11 写一个线程池

多并发时避免系统不断的创建和销毁线程,过度消耗资源、切换等,一般都使用线程池来管理线程。可以让一个线程重复执行多个任务而提高效率,话不多说使用c++11 特性写了一个线程词,直接上代码记录一下,轮子就可以复用啦! 1、在写线程池之前先上一个单例模式,为线程池做单例准备: singleton.h #pragma once #includ...

pqscash12的博客 341

别再乱用标签了!深度解析Unity Addressables标签(Labels)的三种高级用法与性能影响

本文深度解析Unity Addressables标签(Labels)的三种高级用法与性能影响,包括标签组合查询、Pack Together by Label打包策略及运行时性能优化。通过实战代码示例和性能数据对比,帮助开发者实现精细化资源加载控制与包体优化,提升项目效率。

weixin_30500105的博客 508

推荐系统:NDCG评价指标及其Python实现方法

除了推荐任务,在二分类任务中,也可以计算该指标,代码如下: # ndcg def get_dcg(y_pred, y_true, k): #注意y_pred与y_true必须是一一对应的,并且y_pred越大越接近label=1(用相关性的说法就是,与label=1越相关) df = pd.DataFrame({"y_pred":y_pred, "y_true":y_true}) ...

lanyuelvyun的博客 8240

用C++11写一个线程池

1.用c++11实现线程池;2.一个task队列,线程安全3.一个线程池4.线程池从task队列取任务 CMakeLists.txt 完!

zhuxian2009的专栏 572

2026华为OD面试手撕代码真题目录

一般面试的时候每一轮技术面都会出一到两个手撕代码题,这些题的特点就是,非常短小,易于理解。不可能会再出阅读理解一样的机试题的。但是这些题目也非常注意基本功,很注意细节的处理,一般都是easy+medium题目。但是大家一定要注意,因为大部分面试官上面一开始就会让你做题,直接看你所有的做题过程(防止有人水平一般,机试就网上找的答案的蒙混过关),手撕代码题会给你后面的面试定一个基调。

MISAYAONE的博客 9万+

如何写一个C++线程池?

教你怎么一步一步提高C++并发编程的技术

LYX2121的博客 236

发那科机器人通信库使用指南与踩坑记录

GitHubNuGet(如本文基于该库,在 C# / .NET 下通过 TCP 与 FANUC 机器人控制器通信,实现读当前位姿、PR 寄存器、以及 DI/DO/GI/GO 等 IO 的读写。GitHubNuGet(如本文基于该库,在 C# / .NET 下通过 TCP 与 FANUC 机器人控制器通信,实现读当前位姿、PR 寄存器、以及 DI/DO/GI/GO 等 IO 的读写。

songhuangong123的博客 322

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

用C++写一个线程池实例

好的,这是一个使用 C 语言编写的线程池实例: ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define MAX_THREADS 10 // 线程池中最多线程数 #define QUEUE_SIZE 10 // 任务队列中最多任务数 // 线程池中的线程函数 void *...

weixin_35756130的博客 95

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

用c语言写一个线程池,c++实现简单的线程池

这是对pthread线程的一个简单应用1. 实现了线程池的概念,线程可以重复使用。2. 对信号量,互斥锁等进行封装,业务处理函数中只需写和业务相关的代码。3. 移植性好。如果想把这个线程池代码应用到自己的实现中去,只要写自己的业务处理函数和改写工作队列数据的处理方法就可以了。Sample代码主要包括一个主程序和两个线程实现类ThreadTest.cpp:主程序CThr...

weixin_42525798的博客 287

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

写一个c++线程池

好的,以下是一个使用 pthread 库实现的 C 线程池的示例: #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 5 void *thread_func(void *arg) { int thread_num = *((int *)arg); ...

weixin_42600128的博客 55

请用C++写一个线程池

我可以为您编写一个C语言实现的线程池示例: #include<pthread.h> #define MAX_THREAD 5 /* data structure to pass to the thread functions / typedef struct thread_data_s { int id; } thread_data_t; / thread pool...

weixin_42577243的博客 84

手把手教你写一个线程池(C++11)

详细解释线程池的运行流程以及C++代码实现。

m0_73939403的博客 779

使用linux系统函数和c++03类写的一个简单线程池

#include #include #include #include #include #include #include using namespace std; struct task_t { void* (*fun)(void*); void* arg; }; void thread_err(char* err, int s) { fprintf(stderr,

frankwyw的博客 401

写一个线程池,能够根据任务数,增加或者减少线程,用c++模板编程

实现: 我可以为您提供一个简单的C++模板线程池的实现,它可以根据任务数量增加或减少线程。它还可以设置最大线程数量,以防止系统资源耗尽。它的实现如下: template class ThreadPool { public: ThreadPool(size_t size) : maxSize(size) { threads.reserve(size); } ~Thre...

weixin_42596246的博客 104
上一篇: 基于C++写一个mysql连接池
下一篇: 二分查找的思想
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值