2)线程管理会给系统带来开销,context切换同样会给系统带来成本。
3)线程本身是可以重用的资源,不需要每次都进行初始化。
所以往往在使用中,我们无需把线程与task任务进行一对一对应,只需要预先初始化有限的线程个数来处理无限的task任务即可,线程池应运而生,原理也就是如此。

主要含有三个队列
工作队列
工作线程队列
忙碌线程队列
工作队列是一个阻塞队列,任务(仿函数)任务不算被push进来(notify阻塞获取的工作线程),工作线程队列(一直不变)则从该队列中获取任务执行(wait获取,当任务队列为空时阻塞等待通知),如果获取到任务,则将线程会进入忙碌线程队列中,执行任务的仿函数,当工作完成,重新移出工作线程队列。
定义线程池专属异常:
- struct TC_ThreadPool_Exception : public TC_Exception {
- TC_ThreadPool_Exception(const string &buffer) : TC_Exception(buffer){}; TC_ThreadPool_Exception(const string &buffer, int err) : TC_Exception(buffer, err){};
- ~TC_ThreadPool_Exception () throw (){}; };
- /** * @brief 用通线程池类, 与tc_functor, tc_functorwrapper配合使用.
- * * 使用方式说明:
- * 1 采用tc_functorwrapper封装一个调用 * 2 用tc_threadpool对调用进行执行
- * 具体示例代码请参见:test/test_tc_thread_pool.cpp */
- /**线程池本身继承自锁,可以帮助锁定**/
- class TC_ThreadPool : public TC_ThreadLock {
- public:
- /** * @brief 构造函数
- * */
- TC_ThreadPool ();
- /** * @brief 析构, 会停止所有线程
- */ ~TC_ThreadPool ();
- /**
- * @brief 初始化. *
- * @param num 工作线程个数 */










