今天小编给大家分享一下Qt线程池QThreadPool如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。现在所有的高性能服务器程序,几乎都会使用到线程池技术,从而更好且有效的榨干服务器性能。而创建并销毁线程的过程势必会消耗内存。而在日常开发中内存资源是及其宝贵的,所以QT 多线程之线程池QThreadPool就有很大用处了。它可以用来管理线程的优先顺序,防止创建过多的线程,起到很好的管理作用。 线程的创建和销毁是有性能开销的,当我们有少量业务需要处理时,我们可以放到线程中完成,甚至可以多开几个线程并行处理。
那么,问题来了,如果需要海量的数据处理,难道无休止的开线程下去吗?首先,要明白CPU的性能是有限的,每个线程好比一个处理时间片,多个线程之间切换处理,CPU线程上下文来回切换,这个也是需要消耗时间的。所以,物极必反,当线程数量到达一个点后,可能消耗在线程切换的时间,会大于实际线程处理业务的时间,这个可以想象的到。那么很容易明白:线程数并不是越多越好,而是某个范围或者某个经验值。一般来讲,我们可以认为,最佳性能线程数==CPU逻辑核心数量,比如CPU是4核8线程,那么开8个线程可以达到性能最佳。
一般电脑是开启超线程的,也就是4核可以模拟出8个逻辑核,故称4核8线程。
QThreadPool线程池默认最大线程数,也是CPU逻辑Core的数量。
严格意免费云主机域名义来讲,最佳线程数还与处理业务类型有关,如业务属于IO密集型、CPU密集型,根据经验推断:IO密集型,频繁读取磁盘上的数据,或者需要通过网络远程调用接口。线程数经验值是:2N,其中N代表CPU逻辑Core数;CPU密集型,非常复杂的调用,循环次数很多,或者递归调用层次很深等。线程数经验值是:N + 1,其中N代表CPU逻辑Core数。最佳性能线程数可以认为等于CPU逻辑核心数量N,所以我们设计程序,为了得到更好的性能,需要实现如下的需求:限制创建最大线程数量尽可能复用线程,避免频繁创建和销毁线程资源,降低无谓消耗;线程在空闲时,应该休息,避免占用CPU资源;线程在有业务需要处理时,需要激活;当业务来了,这N个线程如何分配;上述问题,高度封装的QThreadPool线程池可以解决。线程池的优点:创建和销毁线程需要和OS交互,少量线程影响不大,但是线程数量太大,势必会影响性能,使用线程池可以这种开销;线程池维护一定数量的线程,使用时,将指定函数传递给线程池,线程池会在线程中执行任务;线程池,属于对象池,对象池都是为了复用,以避免频繁申请和释放对象所造成的性能损失。线程池创建好后,池内默认一个线程也没有,当通过相关函数加入任务后,线程池根据任务数量会自动创建线程,任务会合理分配到各个线程上执行,但是线程总数量不会超过设定的最大值。若任务处理完毕,则池内所有线程进入挂起状态,不占用CPU时间片,待任务再次到来,便会激活部分或全部线程,处理任务。若任务过多,当前没有空闲的线程,则新增任务会被放置到缓存队列中,等待线程空闲后,再进行处理,这样,每个任务与线程可以有一个合理的分配,相当于实现了业务处理的负载均衡。故而可以以最好的性能来处理业务。下面是QThreadPool的常用函数:QRunnable类:所有runable对象的基类。
QRunnable类是一个接口, 用于表示需要执行的任务或代码段, 具体任务在run() 函数内部实现。可以使用QThreadPool在各个独立的线程中执行代码。如果autoDelete() 返回true (默认值), QThreadPool将自动删除QRunnable 。使用setAutoDelete() 可更改是否自动删除。
QThreadPool 是创建线程池函数,QRunnable是线程池的线程具体执行操作函数,两者要搭配使用。执行效果如下:注意:
线程池使用时传入继承于的QRunnable类对象(并启动该线程对象),并且线程池会自主释放在其中的线程(提高程序性能),还能实现并发,提高效率;不过不能使用信号槽进行通信,需要使用QMetaObject::invokeMethod进行通信。以上就是“Qt线程池QThreadPool如何使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。
本篇内容主要讲解“ThinkPHP漏洞复现实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ThinkPHP漏洞复现实例分析”吧!ThinkPHP是一个免费开源的,快速的,简单的面向对象的国产轻量级PHP开发框…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。