Linux-线程池的实现(多线程+条件变量任务队列)

该代码示例展示了如何在C++中使用pthread库创建一个线程安全的阻塞队列(BlockQueue)以及基于该队列的线程池(ThreadPool)。线程池可以接收任务并分配给空闲线程执行,任务通过自定义处理函数处理。测试函数(testfunc)展示了任务的执行逻辑。
摘要由CSDN通过智能技术生成
#include<cstdio>
#include<queue>
#include<pthread.h>
#include<cstdlib>
#include<unistd.h>

#define MAX_QUEUE 10
#define MAX_THREAD 5
typedef void(*handler_t)(int);
class ThreadTask
{
  private:
    int _data;
    handler_t _handler;
  public:
    ThreadTask(){}
    ThreadTask(int data,handler_t handler):_data(data),_handler(handler){}
    void Run()
    {
      _handler(_data);
    }
};

class BlockQueue
{
  private:
    int _capacity;//队列容量
    std::queue<ThreadTask> _queue;
    pthread_mutex_t _mutex;
    pthread_cond_t _cond_pro;
    pthread_cond_t _cond_cus;
  public:
    BlockQueue(int que=MAX_QUEUE):_capacity(que)
    {
      pthread_mutex_init(&_mutex,NULL);
      pthread_cond_init(&_cond_pro,NULL);
      pthread_cond_init(&_cond_cus,NULL);

    }
    ~BlockQueue()
    {
      pthread_mutex_destroy(&_mutex);
      pthread_cond_destroy(&_cond_pro);
      pthread_cond_destroy(&_cond_cus);
    }
     bool Push(const ThreadTask& data)
    {
       pthread_mutex_lock(&_mutex);
       while(_queue.size()==_capacity)
       {
         pthread_cond_wait(&_cond_pro,&_mutex);
       }
       _queue.push(data);
       pthread_cond_signal(&_cond_cus);
       pthread_mutex_unlock(&_mutex);
       return true;
    }

    //输出型参数  传地址 输入输出型 * & 不加const
    bool Pop(ThreadTask* data)
    {
      pthread_mutex_lock(&_mutex);
      while(_queue.empty())
      {
        pthread_cond_wait(&_cond_cus,&_mutex);
      }
      *data=_queue.front();
      _queue.pop();
      pthread_cond_signal(&_cond_pro);
      pthread_mutex_unlock(&_mutex);
      return true;
    }
};

class ThreadPool
{
 private: 
  int  _max_thread;
  BlockQueue _queue;
 private:
 static void* thr_entry(void* arg)//含this指针不符合入口函数格式,需要设置为静态成员函数
  {
    ThreadPool* p=(ThreadPool*)arg;
    while(1)
    {
      ThreadTask task;
      p->_queue.Pop(&task);//获取一个任务节点
      task.Run();
    }
    return NULL;
  }
 public:
  ThreadPool(int maxq=MAX_QUEUE,int maxt=MAX_THREAD):_max_thread(maxt),_queue(maxq)
  {
    int ret;
    pthread_t tid;
    for(int i=0;i<MAX_THREAD;++i)
    {
      ret = pthread_create(&tid,NULL,thr_entry,this);
      if(ret!=0)
      {
        exit(-1);
      }
      pthread_detach(tid);
    }
  }

  bool _PushTask(const ThreadTask& Task)
  {
    _queue.Push(Task);
    return true;
  }
};

void testfunc(int data)
{
 printf("%p--get data:%d,sleep %d sec\n",pthread_self(),data,(data%3)+1);
 sleep((data%3)+1);
}

int main()
{
  ThreadPool pool;
  for(int i=0;i<10;++i)
  {
    ThreadTask task(i,testfunc);
    pool._PushTask(task);
  }
  while(1)sleep(1);
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值