我刚刚用c ++实现了一个非常简单的多线程作业队,我想(并且读过)对每个硬件线程使用一个工作线程是个好主意(在我的情况下是4)。基本上我的应用程序现在只从互联网上加载了很多图像(同时),我注意到如果我将工作线程数增加到8个甚至16个而不是4个,我的速度会大大加快。
是否有一个关于在这样的工作队列中使用多少线程的一般规则?我的猜测是,如果我每帧创建新的作业,那么4就是一个greate数字,而且每个帧的工作线程都有一个恒定的工作量,而如果我想一次处理很多东西(比如加载50个图像)比这更多的线程可以提高速度。不过,在不同情况下,是否有正确数字的经验法则?
由于
答案 0 :(得分:2)
理想的工作线程数等于系统中的CPU核心数。但是,实际上这是次优的,因为有时任务可能会阻塞网络,磁盘I / O等。导致利用不足。这听起来像是在这里发生的事情。
通常情况下,线程池会“过度安排”来弥补这一点。有时会有内置的内核支持在线程阻塞时通知你,所以你知道要启动另一个(Win32中的完成端口)并仍然达到最佳活动工作线程数。
答案 1 :(得分:2)
Microsoft选择提供线程池实现(可从操作系统获得,同样在.net中提供),线程数从处理器数量的1.5倍开始。这个想法是阻塞(对于磁盘i / o等)的线程可以换出另一个未被阻塞的线程。线程池也是可配置的,因此如果您认为需要2x,3x或更多线程,则可以要求最少数量的线程。
我怀疑所有这些都适用于你的情况。
答案 2 :(得分:0)
前段时间我正在寻找这个问题的答案,我遇到了一篇msdn文章,该文章指出每个核心最好使用最多16个线程。不幸的是我再也找不到这篇文章,但是对于加载图像,每个核心有16个线程是有意义的。