2012-10-16 45 views
1

问题:每个进程有多少“QThread”实例是“合理的”?线程,QThread,每个进程有多少是“合理的”?

(这特别参考Qt的QThread实例,但在逻辑上的问题应该使用任何图书馆涉及到任何基于线程的设计。)

例如,据我所知,特定于平台的资源限制可能默认最多支持三十(30)个“QTcpSocket”实例,因此从理论上讲,如果您有三十个活动套接字,那么当系统处于最大负载下时,这将是三十个QThread实例。但是,这可能不是什么大问题,因为大多数这些线程应该对网络流量进行“睡眠/等待”。

同样,我会假设对于负责“重连续工作”的QThread实例,可以实例化“核心”或“本机线程可以执行”的数目。因此,如果您拥有八(8)个内核,那么可能是另外八个QThread实例(并且这些实例可能在系统处于最大负载时全时运行)。

然后,当然,我们有“主线程”。

这是否意味着,然后将一个实例:

(30座线程)+(8工人换每个核心)+(1个主线程)

... 39个线程(在8核心系统上)?

具体而言,如果应用程序的特定需求,有其他的线程池的需求,又添加了一个打─QThread,尤其是圆形和打─QThread -instances,在那里,好像100种QThread情况下是有点傻,即使他们大多数是“空闲/睡觉/等待”,对吧?

那么,有没有一个截止? “39线”是“合理的”,但“300线”是“不合理的”? (是的,我知道有一个“每线程的默认堆栈大小”,如“每线程10MB”,所以我受到虚拟内存的限制。但是,真的,它是愚蠢的实例化30K线程 - 这是一个糟糕的设计,会想要这样的事情吗?)

+0

我经常告诫不要在服务器线程每个连接型模型或大规模P2P码 - 他们没有很好地进行缩放。 (每一个线程都会占用相当多的内存,除非你调整了这些东西。)对于一个客户来说,它可能并不重要(因为要观察的事物数量通常要小得多)。答案几乎完全取决于您制作的应用类型。但是,要知道(至少在大多数线程实现中),一个线程可以很好地观察一堆连接,并将实际工作传递给工作线程池。 – cHao

+0

取决于。卡巴斯在1198个盒子中有166个线程。 –

回答

0

您可以使用QThread::idealThreadCount()找出有多少线程可能会提高性能,当所有忙。对于主要等待的线程,限制取决于操作系统,但对于Qt,最好使用信号插槽系统而不是非常多的线程。只有一个连接了信号的对象比额外的线程总是更轻,特别是如果额外的线程有它自己的事件循环。大多数Qt网络应用程序可能根本不应该使用线程。