C++实现线程池类

C++新特性实现高效线程池,程序性能瞬间提升! 本文深入探讨了如何利用C++新特性实现高效线程池,提升程序性能。首先介绍了C++11和C++14中提供的新特性,如std::thread、std::future、std::function等,并解释了它们如何用于线程池的实现。然后详细介绍了线程池的设计原理和实现过程,包括任务队列的管理、线程的管理以及线程池的调度策略。通过充分利用C++新特性,使得线程池在高并发场景下表现出色,大大提升了程序的性能和响应速度。 阅读详情

* 定义任务类

class Job
{
    Job(void*(*p)(void*),void * a) : process(p),arg(a),next(NULL){}
    void * (* process)(void *);
    void * arg;
    Job * next;
};

任务类的 process 参数是每个线程要执行的函数的指针,arg 为传入该函数的参数


* 定义线程池类

class Pool
{
    friend void * thread_contrl(void*);
    public:

        Pool(int num):max_thread_num(num)  //构造函数必须给出线程池中线程的数量
        {
            pthread_mutex_init(&queue_lock,NULL);
            pthread_cond_init(&queue_cond,NULL);

            threadid = new pthread_t[num];
            shutdown = false;

            for(int i(0); i != num; ++i)
            {
                //线程池中每个线程均执行 thread_contrl(void *) 函数,参数为 Pool*
                //线程通过 thread_contrl 进行调控,并在其内部进行线程任务分配
                pthread_create(&threadid[i],NULL,thread_contrl,this); 
            }
        }

        void add_job(void * (* process)(void *),void * arg)
        {
            Job * temp = new Job(process,arg);

            //在任务队列中增加新任务,需要先通过上锁进行访问
            pthread_mutex_lock(&queue_lock);
            queue_q.push(temp);
            pthread_mutex_unlock(&queue_lock);
            //发送任务进入信号,唤醒等待线程
            pthread_cond_signal(&queue_cond);
        }

        ~Pool()
        {
            if(shutdown)
                return;
            //唤醒所有线程
            pthread_cond_broadcast(&queue_cond);
            for(int i(0); i < max_thread_num; ++i)
            {
                //等待线程结束
                pthread_join(threadid[i],NULL);
            }
            delete []threadid;

            Job * temp = NULL;
            while(!queue_q.empty())
            {
                temp = queue_q.front();
                queue_q.pop();
                delete temp;
                temp = 0;
            }
            pthread_mutex_destroy(&queue_lock);
            pthread_cond_destroy(&queue_cond);
        }

        queue<Job *> queue_q;
        pthread_mutex_t queue_lock;
        pthread_cond_t queue_cond;
        pthread_t * threadid;
        int max_thread_num;
        bool shutdown;   //线程池开关信号
};


* 定义线程控制函数 void * thread_contrl(void * arg)

void * thread_contrl(void * arg)
{
    Pool * pool = reinterpret_cast<Pool *>(arg);
    while(1)
    {
        //需要获得线程池 pool 中的任务,因此在访问任务列表前需要上锁
        pthread_mutex_lock(&pool->queue_lock);

#ifndef WORK    //用于调试信息的输出
        cout << "starting thread : " << pthread_self() << endl;
#endif

        while(pool->queue_q.empty() && pool->shutdown == false)
        {

#ifndef WORK    
            cout << "thread : " << pthread_self() << " is waiting"<< endl;
#endif

            pthread_cond_wait(&pool->queue_cond,&pool->queue_lock);
        }
        if(pool->shutdown)  //线程池关闭信号打开
        {
            pthread_mutex_unlock(&pool->queue_lock);
            pthread_exit(NULL);
        }

#ifndef WORK    
            cout << "thread : " << pthread_self() << " is starting working"<< endl;
#endif

        //从任务列表中领取一项任务
        Job * temp = pool->queue_q.front();
        pool->queue_q.pop();
        pthread_mutex_unlock(&pool->queue_lock);

        //获得任务的线程执行领取的任务
        *(temp->process)(temp->arg);
        delete temp;
        temp = 0;
    }
}


*使用实例:


void * test(void * arg)
{
    int num = reinterpret_cast<int>(arg);
    printf("%d\n",num);

    //***使用 printf 而不使用 cout 的原因之后描述
    sleep(1);
    return NULL;
}

int main()
{
    Pool * pool = new Pool(3);    //建立三线程的线程池
    for(int i (0); i  < 10; ++i)
    {
        pool->add_job(test,reinterpret_cast<void*>(i));
    }
    sleep(6);
    printf("end main\n");
}

输出结果为:每三个连续输出,后停顿一秒,输出下三个,因为线程池中是三线程,此时是三线程同步跑

多线程中使用 printf 而不使用 cout 的原因:printf()函数的输出是一次函数调用,此时输出不会被打断;而cout函数而言,<< 操作符的每次使用都是一次函数调用,有可能在每次<<调用之间线程被调度,使得输出被打断。因此在多线程输出中使用 printf 比使用 cout 好

STM32CubeMX、keil、simulink联合开发MCU教程 一、整体思路 利用Matlab的simulink搭建模型生成C代码,通过stm32cubemx生成工程,最后在KEIL或者IAR等工具里面编译生成代码下载至MCU中执行。 本文以流水灯建立模型和简单使用定时器为例进行演示。 二、开发环境 1、安装Matlab Matlab版本建议在2013B以上,本文使用Matlab 2016a。 2、安装STM32硬件支持包 下载地址(https://www.stmcu.org.cn/document/detail/index/id-216053) 安装完成后重启MAT 阅读详情

相关推荐

基于分数阶傅里叶变换的chirp信号检测与参数估计(原理附代码)

线性调频信号(chirp信号) 顾名思义,该信号的频率随着时间线性变换,其复数表达形式如下: s(t)=e2jπ(f0t+0.5μt2)s(t)=e^{2j\pi(f_0 t+ 0.5\mu t^2)}s(t)=e2jπ(f0​t+0.5μt2) 根据欧拉公式,其相位项为2π(f0t+0.5μt2))2\pi(f_0 t+ 0.5\mu t^2))2π(f0​t+0.5μt2))。信号的角频率是相位对时间的导数。对相位求导后有2π(f0+μt)2\pi(f_0+\mu t)2π(f0​+μt),显然,f0f

weixin_42845306的博客 1万+

C++实现线程池

进程是一个独立的执行单位,每个进程都有自己的独立内存空间,包括代码、数据、堆栈等。进程之间彼此独立,不共享内存,通常通过进程间通信来交换数据。

pan_1214_的博客 4586

Fluent 2.5D动网格重构实战:涡旋压缩机复杂运动模拟指南

本文详细解析了Fluent 2.5D动网格重构技术在涡旋压缩机复杂运动模拟中的应用。通过对比传统方法,2.5D重构显著提升了计算效率和稳定性,特别适用于柱体类几何的网格处理。文章提供了从基础配置到参数优化的实战指南,包括关键设置步骤、常见问题排查及性能优化策略,帮助工程师有效解决动网格重构中的负体积和网格畸变问题。

weixin_28455801的博客 549

c++11 自定义线程类实现线程的启动、暂停与停止

【代码】c++11 自定义线程类实现线程的启动、暂停与停止。

开挂的熊猫 1555

MacBook Pro 合盖省电终极配置:pmset 5条命令实现一夜掉电<1%

本文详细介绍了如何通过5条pmset终端命令优化MacBook Pro的合盖休眠设置,实现一夜掉电<1%的极致省电效果。针对M系列芯片的特性,文章解析了MacOS的休眠机制,并提供电池模式与电源模式的差异化配置方案,帮助用户显著提升续航表现。

weixin_33824385的博客 477

QGIS v3.28 高效加载OSM在线地图的三种实用方法

本文详细介绍了在QGIS v3.28中高效加载OSM在线地图的三种实用方法:通过XYZ Tiles直接连接、使用QuickMapServices插件以及配置WMS/WTMS服务。针对每种方法提供了具体操作步骤、常见问题解决方案和性能优化建议,帮助用户根据需求选择最适合的方案,提升GIS工作效率。

weixin_29233333的博客 434

c++实现线程池

c++实现线程池

tonny的博客 2833

【事件相机实战】噪声识别与智能滤波技术解析

本文深入解析了事件相机应用中关键的噪声识别与智能滤波技术。针对背景活动噪声、阈值波动噪声、热点噪声及运动边缘尾迹等核心噪声类型,文章剖析了其成因与特征,并详细介绍了从经典的时空相关性滤波、热点像素滤除到前沿的深度学习(如EDnCNN)等实战滤波方法,旨在帮助开发者在保证低延迟的前提下,有效提升事件流数据质量。

weixin_29169899的博客 439

【线程同步】c++实现class类封装线程池

本文从线程池的概念到构造,以及各功能函数的实现,手把手带你实现线程池。

2401_86153466的博客 529

从隐私保护到生命守护:CPD技术中的传感器选择与权衡

本文探讨了智能座舱中儿童存在检测(CPD)技术的传感器选择与隐私保护平衡策略。通过分析毫米波雷达、UWB等先进技术的性能与隐私风险,揭示了如何在确保儿童安全的同时保护用户隐私。文章还展望了CPD技术与座舱生态系统的未来融合趋势,为汽车安全领域提供了重要参考。

weixin_29159441的博客 301

STM32入门教程:无人机控制

我们将会一步一步引导您完成无人机的控制代码,包括无人机的姿态控制、飞行控制和通信控制等。第三步:配置无人机姿态控制 无人机的姿态控制是指控制无人机在空中的倾斜和转向。为了实现姿态控制,我们需要使用加速度计和陀螺仪传感器来获取无人机的姿态信息,并使用PID控制算法来控制无人机的姿态。在这一步骤中,您需要根据您使用的具体传感器和控制算法的要求进行更详细的配置和编码。在通信控制中,您需要考虑到通信的稳定性和可靠性。第五步:通信控制 无人机的通信控制是指与地面站或其他设备进行通信,传输飞行数据和接收飞行指令。

m0_75244442的博客 747

C++11线程池类的简单实现

C++线程池类的创建

K_ZhJ18的博客 324

EXCEL VBA从入门到精通 第一章:VBA入门

在VBA中,需要使用关键字Dim来定义一个变量,后面跟上变量名和变量的数据类型。例如,下面的代码定义了一个整型变量x和一个字符串变量name在VBA中,使用关键字Const来定义常量,后面跟上常量名和常量的值。例如,下面的代码定义了一个整型常量MAX_NUM和一个字符串常量MESSAGE需要注意的是,常量一旦被定义,其值就不能被改变。

1万+

C++17future类+可变参模板实现线程池

C++17future类+可变参模板实现线程池

weixin_43973403的博客 2012

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c++实现带锁的线程池类

话不多说上代码: 线程锁类: #pragma once #include <pthread.h> #include <unistd.h> namespace lock_summary { class ILock { public: ILock(){} virtual ~ILock(){} public: virtual void lock() = 0; virtual void unlock() =

cat_eat_fish 284

SAP B1中文培訓教材_SDK

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

一个Windows C++的线程池类实现

1.首先是线程池类: Thread.h [cpp] view plain copy #ifndef __THREAD_H__   #define __THREAD_H__      #include       #include      #include         class Runnable   {

积累点滴,保持自我 1704

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++11 新接口 实现线程池类

class Job { protected: int i; public: Job(int c) :i(c) {} virtual void doJob() { printf("job : %d\n", i);} }; class ThreadPool { vector pool; public: ThreadPool(int n):close(false), max_num(n)

Virtual_Func的博客 835

linux通过c++实现线程池类

原文:https://www.cnblogs.com/ailumiyana/p/9402761.html 目录 线程池的实现 线程池已基于C++11重写:基于C++11实现线程池的工作原理 前言 线程池的概念 使用原因及适用场合 线程池的实现原理 程序测试 线程池的实现 线程池已基于C++11重写:基于C++11实现线程池的工作原理 前言 初学C++,想封...

wang13342322203的博客 335

c++类线程池实现

main #include <stdio.h> #include <pthread.h> #include <string.h> #include <unistd.h> #include <stack> #include "CTask.h" #include "CThreadPool.h" #include <iostream> using namespace std; int main() { CThreadPool*

z15005953031的博客 183

深入理解rknn-cpp-Multithreading架构:线程池类(rknnPool.hpp)设计与实现

rknn-cpp-Multithreading是一个使用C++在RK3588/3588s上运行的yolov5s简单demo,能够实现约142帧/秒的高效目标检测。本文将深入剖析其核心架构中的线程池类(rknnPool.hpp)设计与实现,帮助开发者理解如何通过多线程优化提升RKNN模型推理性能。 ## 线程池类设计核心目标 rknnPool.hpp作为项目的核心组件,主要解决以下关键问题:

gitblog_00644的博客 297

使用 C++11 实现的动态线程池项目学习

因为当线程池要关闭的时候,可能还有任务需要执行,我们最好让任务都执行完之后再关闭线程池,所以唤醒所有线程去任务队列中找任务执行;在上面的代码示例中,而且,即使作用域内部发生了异常,只要退出了作用域,就会自动解锁,避免了作用域异常导致解锁操作没有执行,从而阻塞所有线程;头文件定义的一个模板类,它封装了一个可调用对象(例如函数、lambda 表达式或函数对象),并提供了异步执行的能力。如此一来,线程不需要等待条件变量,只要任务队列中有任务,或者要销毁线程池,就立刻返回, 然后根据对应逻辑执行任务;

OutlierLi's Blog 1293

cpp11实现线程池(二)——ThreadPool相关类的设计

enum class能够确保枚举项相同时可以区分开来,如。

qq_42120843的博客 293

在c#中用mutex类实现线程的互斥_C++线程池

本文希望通过实现一个线程池,加深对线程池的理解以及C++11新特性的使用。线程池作用 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。 线程池组成 任务队列 执行队列 管理组件 加锁 mutex 条件等待 condition_variable线程池实现#ifndef TH...

weixin_39540426的博客 174
上一篇: 建立TCP连接,实现基本通信
下一篇: 6.1 对象的构造与析构
Virtual_Func
博客等级 码龄11年 38粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值