3

我刚刚在 C++ 中实现了一个非常简单的多线程作业队列,我认为(并阅读)为每个硬件线程使用一个工作线程是个好主意(在我的情况下是 4 个)。基本上我的应用程序现在只是从互联网上加载了很多图像(同时),我注意到如果我将工作线程的数量增加到 8 个甚至 16 个而不是 4 个,我会获得巨大的速度。

在这样的作业队列中使用多少个线程是否有一般规则?我的猜测是,如果我每帧都创建新作业,并且工作线程每帧的工作量恒定,而如果我想一次处理很多东西(比如加载 50 张左右的图像),那么 4 将是一个更大的数字比这更多的线程可以大大加快速度。不过,在不同情况下是否有正确数字的经验法则?

谢谢

4

3 回答 3

2

理想的工作线程数等于系统中的 CPU 内核数。然而,实际上这是次优的,因为有时任务可能会阻塞网络、磁盘 I/O 等。导致利用率不足。这听起来像是这里正在发生的事情。

通常,线程池会“超期”来弥补这一点。有时,内核支持在线程阻塞时通知您,因此您知道启动另一个(Win32 中的完成端口)并且仍然达到活动工作线程的最佳数量。

于 2010-12-03T23:52:04.263 回答
2

Microsoft 选择提供线程池实现(可从操作系统获得,同样可在 .net 中获得),线程数从处理器数的 1.5 倍开始。这个想法是阻塞的线程(用于磁盘 i/o 等)可以换出另一个未被阻塞的线程。线程池也是可配置的,因此如果您决定需要 2x、3x 或更多线程,您可以要求最少的线程数。

我怀疑所有这些都适用于您的情况。

于 2010-12-04T00:02:10.593 回答
0

前段时间我在寻找这个问题的答案,我遇到了一篇 msdn 文章,其中指出最好每个内核最多使用 16 个线程。不幸的是,我再也找不到这篇文章了,但是对于加载图像,每个内核 16 个线程是有意义的。

于 2010-12-03T23:46:30.027 回答