C++实现一个简单的线程池的示例代码

 更新时间:2022年05月19日 08:55:54   作者:phil__naiping  
本文主要介绍了C++实现一个简单的线程池的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、设计

线程池应该包括

  • 保存线程的容器,保存任务的容器。
  • 为了能保证避免线程对任务的竞态获取,需要对任务队列进行加锁。
  • 为了使得工作线程感知任务的到来,需要使用条件变量来唤醒工作线程。
  • 任务容器中的任务管理。
  • 任务的处理API。

二、参数选择

使用数组存放线程,链表存放任务。

请添加图片描述

三、类设计

线程池类

template<typename T>
class threadpool
{
public:
    threadpool(int thread_num,int max_request);
    ~threadpool();
    bool append(T* request);    // 在任务队列中添加任务
private:
    static void worker(void* arg);
    void run();
private:
    int m_thread_num;           // 线程池中的线程数
    int m_max_request;          // 任务队列最大保存的任务数
    pthread_t *m_threads;       // 保存线程的容器
    std::list<T*>m_queuework;   // 保存任务的链表
    sem m_sem;                  // 通知工作线程任务到来
    lock m_locker;				// 互斥访问任务队列
};

构造函数

template<typename T>
threadpool<T>::threadpool(int thread_num,int max_request):m_thread_num(thread_num),m_max_request(max_request)
{
    if(thread_num <=0 || max_request <= 0) throw std::exception();
    m_threads = new pthread_t[thread_num];
    if(!m_threads) throw std::exception();
    for(int i = 0;i < thread_num;++i)
    {
        // 创建线程
        if(pthread_create(m_threads + i, NULL,worker,this)!=0)
        {
             delete[] m_threads;
             throw std::exception();
        }
        // 分离线程
        if(pthread_detach(m_threads[i]))
        {
             delete[] m_threads;
             throw std::exception();
        }
    }
}

析构函数

template<typename T>
threadpool<T>::~threadpool()
{
   delete[] m_trheads;
}

添加任务函数

template<typename T>
bool threadpool<T>::append(T* request)
{
    m_locker.lock();
    if(m_queuework.size() > m_max_request)
    {
         m_locker.unlock();
         return false;
    } 
    m_queuework.push_back(request);
    m_locker.unlock();
    m_sem.post();
    return true;
}

任务处理函数

template<typename T>
void* threadpool<T>::worker(void*arg)
{
    threadpool* pool = (threadpool*)arg;
    pool->run();
    return pool;
}

template<typename T>
void threadpool<T>::run()
{
    while(true)
    {
         m_sem.wait();
         m_locker.lock();
         if(m_queuework.empty())
         {
             m_locker.unlock();
             continue;
         }
         T* request = m_queuework.front();
         m_queuework.pop_front();
         m_locker.unlock();      
         request.process();      // 具体任务的处理业务
    }
}

到此这篇关于C++实现一个简单的线程池的示例代码的文章就介绍到这了,更多相关C++ 线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 清除3389远程登录日志

    清除3389远程登录日志

    这篇文章主要介绍了清除3389远程登录日志示例,需要的朋友可以参考下
    2014-01-01
  • 使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小(最新推荐)

    使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小(最新推荐)

    这篇文章主要介绍了使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • C++中this指针的理解与作用详解

    C++中this指针的理解与作用详解

    这篇文章主要给大家介绍了关于C++中this指针的理解与作用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • 基于Matlab图像处理的公路裂缝检测实现

    基于Matlab图像处理的公路裂缝检测实现

    随着公路的大量投运,公路日常养护和管理已经成为制约公路运营水平提高的瓶颈,特别是路面状态采集、检测维护等工作更是对传统的公路运维模式提出了挑战。这篇文章主要介绍了如何通过Matlab图像处理实现公路裂缝检测,感兴趣的可以了解一下
    2022-02-02
  • c语言malloc函数的用法示例和意义

    c语言malloc函数的用法示例和意义

    mallo函数返回的实际是一个无类型指针,必须在其前面加上指针类型强制转换才可以使用,这篇文章主要介绍了c语言malloc函数的用法示例和意义,需要的朋友可以参考下
    2022-12-12
  • C语言数据类型转换实例代码

    C语言数据类型转换实例代码

    本文主要介绍C 语言数据类型转换,这里通过代码实例进行详解,这是C语言基础部分,需要的朋友可以参考下
    2016-07-07
  • C++解决回调地狱问题的方法小结

    C++解决回调地狱问题的方法小结

    “地狱回调”(Callback Hell)是指在编程中使用过多嵌套回调函数,导致代码难以阅读和维护,本文给大家介绍了C++解决回调地狱问题的方法小结,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-07-07
  • HDOJ 1443 约瑟夫环的最新应用分析详解

    HDOJ 1443 约瑟夫环的最新应用分析详解

    本篇文章是对HDOJ 1443 约瑟夫环的最新应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言如何解决约瑟夫环问题

    C语言如何解决约瑟夫环问题

    文章总结了四种解决特定问题的方法,包括单循环链表法、循环数组法、递归法和迭代法,并分享了个人经验
    2024-12-12
  • C++获取当前时间戳的几种常用方法

    C++获取当前时间戳的几种常用方法

    在我们写程序时,通过写时间戳可以方便我们进行日志记录、调试、计算程序运行时间、缓存过期控制等,因此下面介绍使用C++代码获取时间戳的方法以及一些常见的应用场景,需要的朋友可以参考下
    2025-08-08

最新评论