处理大量并发任务,一个请求一个线程来处理请求任务,大量的线程建立和销毁将过多的消耗系统资源,还增长了线程上下文切换开销。并发
线程池经过在系统中预先建立必定数量的线程,当任务请求到来时从线程池中分配一个预先建立的线程去处理任务,线程在处理任务以后还能够重用,不用销毁,从而节省系统资源。对于多核处理器,线程会被分配到多个CPU,提升并行处理效率。每一个线程独立阻塞,防止主线程被阻塞而使主流程被阻塞异步
三层函数
第一层:同步服务层,处理上层任务请求spa
第二层:同步排队层,上层的任务请求放到同步排队层中等待处理(同步队列)线程
第三层:异步服务层,多个线程同时处理排队层中的任务,从同步排队层取出任务并处理3d
线程池有两个活动过程blog
一个是往同步队列中添加任务过程队列
一个是从同步队列中取任务过程资源
《深刻应用C++11》有完整的代码,可是用到的C11技术不少——锁,条件变量,move,很差记,大致讲一下思路同步
须要实现两个类,一个类用于实现同步队列(SyncQueue类),另外一个类用于实现线程池(ThreadPool)
SyncQueue类
同步队列类彻底能够用生产者消费者代替,书上代码用的条件变量实现的同步队列,这个类有个六个成员变量:
缓冲区用list:template<typename T> std::list<T> m_queue
互斥变量:std::mutex m_mutex
两个条件变量或者两个信号量,full和empty
同步队列最大size:int m_maxsize
中止标志:bool m_needstop
成员函数:
Take函数:取任务,P(full) mutex.lock mutex.unlock V(empty)
Add函数: P(empty) mutex.lock mutex.unlock V(full)
Stop函数
ThreadPool类
ThreadPool类有三个成员变量:
线程组:std::list<std::shared_ptr<std::thread>> m_threadgroup
同步队列: SyncQueue<Task> m_queue
中止线程池:bool m_running
成员函数:
Start:一个任务是建立线程放到线程组里,并取任务执行m_queue.Take
Stop:让同步队列中的线程中止,m_running = false 另外用thread.join来使每一个调用中的线程结束