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++ 线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C++中的析构函数

    详解C++中的析构函数

    这篇文章主要介绍了C++中的析构函数的相关知识,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 详解C++引用变量时那些你不知道的东西

    详解C++引用变量时那些你不知道的东西

    这篇文章主要为大家详细介绍了C++引用变量时那些你不知道的东西——引用变量延迟绑定,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-11-11
  • C语言实现的猴子吃桃问题算法解决方案

    C语言实现的猴子吃桃问题算法解决方案

    这篇文章主要介绍了C语言实现的猴子吃桃问题解决方案,较为详细的分析了猴子吃桃问题并给出了C语言算法的实现方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • c++11可变参数使用示例

    c++11可变参数使用示例

    这篇文章主要介绍了c++11可变参数使用示例,需要的朋友可以参考下
    2014-03-03
  • 纯C语言:递归最大数源码分享

    纯C语言:递归最大数源码分享

    这篇文章主要介绍了纯C语言:递归最大数源码,需要的朋友可以参考一下
    2014-01-01
  • C++实现计算器功能

    C++实现计算器功能

    这篇文章主要为大家详细介绍了C++实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++中I/O模型之select模型实例

    C++中I/O模型之select模型实例

    这篇文章主要介绍了C++中I/O模型的select模型,实例讲述了I/O模型的用法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • 详解Matlab实现动态表白图的绘制

    详解Matlab实现动态表白图的绘制

    这篇文章主要利用Matlab实现绘制独特的表白动图,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-05-05
  • C语言菜鸟基础教程之求1到100的和

    C语言菜鸟基础教程之求1到100的和

    在C语言中可以通过定义一个累加器(一个变量)并结合for循环来实现计算1到100之和。
    2017-10-10
  • C语言扫雷游戏的简单实现

    C语言扫雷游戏的简单实现

    这篇文章主要为大家详细介绍了C语言扫雷游戏的简单实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论