| 
                        
                         线程池 
一、定义:线程池是一种线程使用模式。 
二、目的:线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用线程池linux,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 
三、应用场景: 
四、线程池示例: 
功能:1. 创建固定数量线程池,循环从任务队列中获取任务对象, 
2. 获取到任务对象后,执行任务对象中的任务接口 
/* 线程池 */  
#ifndef __M_POOL_H_
#define __M_POOL_H_ 
#include
#include
#include
#include
#include
#include
#include
#define MAX_THREAD 5
#define MAX_QUEUE 10
typedef bool (*HandleFunc)(int data);
class MyTask
{
  private:
    int _data;
    HandleFunc _handleFunc;
  public:
    MyTask(){}
    MyTask(int data,HandleFunc handleFunc)
      :_data(data)
       ,_handleFunc(handleFunc) {}
    ~MyTask(){}
   void SetTask(int data,HandleFunc handleFunc)
   {
     _data = data;
     _handleFunc = handleFunc;
   }
   bool Run()
   {
     return _handleFunc(_data);
   }
};
class MyThreadPool
{
  private:
    int max_thread;   //线程池中最大线程数
    int cur_thread;   //当前线程池中的线程数
    int quitFlag;     //线程池中线程退出的标志
    int max_queue;    //队列的最大节点数
    std::queue task_list;    //任务队列
    pthread_mutex_t mutex;    //互斥量
    pthread_cond_t empty;     //条件变量
    pthread_cond_t full;      //条件变量
    void ThreadLock()       //加锁
    {
      pthread_mutex_lock(&mutex);
    } 
    void ThreadUnLock()     //解锁
    {
      pthread_mutex_unlock(&mutex);
    }
    void ConsumerWait()    //消费者等待(为空则等待)
    {
      if(quitFlag == true)  //所有任务均完成,则线程退出
      {
        cur_thread--;
  
        pthread_mutex_unlock(&mutex);
        printf("Thread[%p] exited.\n",pthread_self());
        pthread_exit(NULL);
      }
      pthread_cond_wait(&empty,&mutex);
    }
    void ConsumerWake()  //唤醒消费者
    {
      pthread_cond_signal(&empty);
    }
    void ConsumerWakeAll()  //广播唤醒剩余所有线程
    {
      pthread_cond_broadcast(&empty);
    }
    void ProducterWait()   //生产者等待(满了则等待)
    {
      pthread_cond_wait(&full,&mutex);
    }
    void ProducterWake() //唤醒生产者
    {
      pthread_cond_signal(&full);
    }
    bool QueueEmpty()
    {
      return task_list.empty();
    }
    bool QueueFull()
    {
      return (task_list.size() == max_queue ? true : false);
    }
    void QueuePush(MyTask& task)      //将task放入任务队列
    {
      task_list.push(task);
    }
    void QueuePop(MyTask* task)       //从任务队列取出task
    {
      *task = task_list.front();
      task_list.pop();
    }
  public:
    MyThreadPool(int maxt = MAX_THREAD,int maxq = MAX_QUEUE)
      :max_thread(maxt)
       ,max_queue(maxq)
    {
      cur_thread = maxt;
      quitFlag = false;
      pthread_mutex_init(&mutex,NULL);
      pthread_cond_init(&empty,NULL);
      pthread_cond_init(&full,NULL);
    } 
    ~MyThreadPool()
    {
      pthread_mutex_destroy(&mutex);
      pthread_cond_destroy(&empty);
      pthread_cond_destroy(&full);
    }
    static void* ThreadFunc(void* arg)  //线程执行函数
    {
      std::cout<<"In ThreadFunc()"<ThreadLock();
        while(p->QueueEmpty())        //任务队列没任务
          p->ConsumerWait();
        MyTask task;
        p->QueuePop(&task);
        p->ProducterWake();
        p->ThreadUnLock();
        task.Run();
      }
      return NULL;
    }
    bool MyThreadPool_Init()       //初始化线程池
    {
      pthread_t tid;
      int ret;
      for(int i = 0;i 0)   //退出线程池内的所有线程
      {
        ConsumerWakeAll();    
        usleep(3000);
      }
    }
};
bool TaskHandle(int data)
{
  srand((unsigned int)time(NULL));
  int n = rand()%5;
  printf("Thread[%p] is ready to sleep for %d seconds.\n",pthread_self(),n);
  sleep(n);
  return true;
}
int main()
{
  MyThreadPool p;
  p.MyThreadPool_Init();
  MyTask task[10];
  for(int i =0;i<10;++i)
  {
    task[i].SetTask(i,TaskHandle);
    p.AddTask(task[i]);
    printf("task[%d] : Add success!\n ",i);
  }
  p.MyThreadPool_Quit();
  return 0;
}
#endif  
  
  
                                                (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |