【问题标题】:c++ Jobqueue: Is there a rule of thumb for the number of worker threads?c++ Jobqueue:工作线程的数量有经验法则吗?
【发布时间】:2011-05-20 01:12:22
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: c++ multithreading queue jobs


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我忘了说,我在 OSX 上(使用 boost::thread),由于可移植性,我喜欢在这方面自己编写代码。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多