1

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

(这特别引用了 Qt 的QThread实例,但从逻辑上讲,这个问题应该与使用任何库的任何基于线程的设计有关。)

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

同样,我会假设对于承担QThread“繁重连续工作”的实例,最多可以实例化“核心”或“本机线程可以执行”的数量。因此,如果您有八 (8) 个内核,则可能是另外八个QThread实例(当系统处于最大负载时,这些实例可能一直在工作)。

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

这是否意味着将实例化:

(30 个套接字线程)+(每个核心 8 个工作线程)+(1 个主线程)

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

具体来说,如果特定于应用程序的需求有其他线程池需求,并且您添加了QThread十几个QThread- 这里和十几个 - 实例 - 似乎 100 个QThread实例有点愚蠢,即使它们中的大多数是“空闲/睡觉/等待”,对吧?

那么,有断档吗?“39 线程”是“合理的”,但“300 线程”是“不合理的”?

(是的,我知道有一个“每个线程的默认堆栈大小”,例如“每个线程10MB”,所以我受到虚拟内存的限制。但是,真的,实例化30K线程是不是很愚蠢- - 这是一个糟糕的设计,会想要这样的东西吗?)

4

1 回答 1

0

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

于 2012-10-16T20:43:07.540 回答