深入解析C++编程中线程池的使用

2020-01-06 14:01:59于海丽

2)线程管理会给系统带来开销,context切换同样会给系统带来成本。

3)线程本身是可以重用的资源,不需要每次都进行初始化。

所以往往在使用中,我们无需把线程与task任务进行一对一对应,只需要预先初始化有限的线程个数来处理无限的task任务即可,线程池应运而生,原理也就是如此。

深入解析C++编程中线程池的使用

主要含有三个队列

工作队列

工作线程队列

忙碌线程队列

工作队列是一个阻塞队列,任务(仿函数)任务不算被push进来(notify阻塞获取的工作线程),工作线程队列(一直不变)则从该队列中获取任务执行(wait获取,当任务队列为空时阻塞等待通知),如果获取到任务,则将线程会进入忙碌线程队列中,执行任务的仿函数,当工作完成,重新移出工作线程队列。

定义线程池专属异常:

 

 
  1. struct TC_ThreadPool_Exception : public TC_Exception  { 
  2. TC_ThreadPool_Exception(const string &buffer) : TC_Exception(buffer){};  TC_ThreadPool_Exception(const string &buffer, int err) : TC_Exception(buffer, err){}; 
  3. ~TC_ThreadPool_Exception () throw (){};  }; 
  4.    
  5. /**  * @brief 用通线程池类, 与tc_functor, tc_functorwrapper配合使用. 
  6. *   * 使用方式说明: 
  7. * 1 采用tc_functorwrapper封装一个调用  * 2 用tc_threadpool对调用进行执行 
  8. * 具体示例代码请参见:test/test_tc_thread_pool.cpp  */ 
  9.   /**线程池本身继承自锁,可以帮助锁定**/ 
  10. class TC_ThreadPool : public TC_ThreadLock  { 
  11. public:   
  12. /**  * @brief 构造函数 
  13. *  */ 
  14. TC_ThreadPool ();   
  15. /**  * @brief 析构, 会停止所有线程 
  16. */  ~TC_ThreadPool (); 
  17.   /** 
  18. * @brief 初始化.  *  
  19. * @param num 工作线程个数  */