QT-线程池

本文深入探讨了线程池的设计理念及其在处理大量并发任务中的作用,特别是聚焦于QThreadPool的使用方法,包括如何创建、设置最大线程数及任务对象的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在程序逻辑中经常会碰到需要处理大批量任务的情况,比如密集的网络请求,或者日志分析等等。一般会创建一个队列,用一个或者多个线程去消费这个队列,一般也要处理队列的加锁和解锁的问题,除非在设计时就能够做到专列专用,否则锁是不可避免的。而且在入队和出队的操作上肯定还是要加锁,因为他们是在不同线程对同一个资源进行操作。

        线程池就是为这个而设计的,比如

        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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值