在程序逻辑中经常会碰到需要处理大批量任务的情况,比如密集的网络请求,或者日志分析等等。一般会创建一个队列,用一个或者多个线程去消费这个队列,一般也要处理队列的加锁和解锁的问题,除非在设计时就能够做到专列专用,否则锁是不可避免的。而且在入队和出队的操作上肯定还是要加锁,因为他们是在不同线程对同一个资源进行操作。
线程池就是为这个而设计的,比如
Windows自带的线程池: CreateThreadpoolWork SubmitThreadpoolWork
boost的线程池: io_service std::thread, 由io_service来调度线程
QT: QThreadPool
这里说QThreadPool, 最简单的创建线程池的方法,就是创建一个QThreadPool对象,然后调用start将继承自QRunnable的任务对象传入,这样任务对象就被放入了线程池的队列中。实现任务方法,需要继承QRunnable并重写run方法,线程池会调用这个方法来执行。
我们也可以调用QthreadPool::setMaxThreadCount来设定线程池的最大线程数,默认是同CPU核心数相同。
这里要注意继承自QRunnable生命周期如果没有被管理起来,想要在执行完成后自动释放,那就需要Qrunnable::setAutoDelete(true),在执行完成后会自动释放掉任务对象。
对于普通的任务消费,这几个接口完全够用了,QT还有一个更简易的用于执行任务的方法:
QtConcurrent::run这个方法其实也是将任务放入了一个线程池中去处理,观察一下他的接口:
QFuture<T> QtC