代码之家  ›  专栏  ›  技术社区  ›  Trap

每个处理器生成多个线程是否有意义?

  •  8
  • Trap  · 技术社区  · 16 年前

    从逻辑的角度来看,一个应用程序可能需要几十或数百个线程,其中一些线程将大部分时间处于休眠状态,但很少的线程将始终同时运行。问题是:产生比系统中的处理器更多的并发线程是否有意义,或者这是一种浪费?

    我见过一些服务器应用程序实现了一个调度程序来逻辑地管理任务(通常称为作业),但也产生了许多线程,所以我不知道好处在哪里。

    事先谢谢。

    9 回复  |  直到 14 年前
        1
  •  23
  •   benjismith    16 年前

    当然。如果您的软件经常使用磁盘或网络IO,您通常可以通过添加更多线程来提高吞吐量。当其他线程阻塞IO时,这些额外的线程将处于唤醒状态并执行任务。

        2
  •  12
  •   dmckee --- ex-moderator kitten    16 年前

    另一些人谈到了一些情况,在这些情况下,它几乎肯定是有意义的(当你做任何一种缓慢的IO时)。

    它可能 如果:

    • 你的线程正在做CPU绑定的工作

    • 每个线程都希望使用大量不重叠的内存(即与缓存大小相比具有显著性)。

    在这种情况下,可能会导致不必要的缓存未命中。

        3
  •  6
  •   mghie    16 年前

    如果

    1. 您的程序设计的好处在于,您有在线程中最好实现的并行任务,或者

    2. 您的一些线程是I/O绑定的,因此它们不单独使用处理器/内核。

        4
  •  4
  •   Axelle Ziegler    16 年前

    简短的回答是“是”。

    即使认为在多处理器环境中进行多线程处理可以获得更多的好处,它仍然是单处理器机器上的一项有用技术,主要是因为它意味着您将一些工作委托给流程调度器,后者应该比您拥有的信息更好。

    如果你不使用多线程,你最终会自己完成调度任务,如果你需要的话,这可能是件好事,但很可能是既单调又低效的事情。

        5
  •  3
  •   Boris Pavlović    16 年前

    每当您有一个任务在等待一个I/O操作时,将它封闭在一个线程中并激发它确实是有意义的。在等待I/O操作完成时,线程很可能会挂起。当它被唤醒时,结果将等待它。

        6
  •  3
  •   mouviciel    16 年前

    其中一个好处是当您升级硬件时,可能会得到更多的处理器/核心。

        7
  •  2
  •   Sesh    16 年前

    因为所有的现代操作系统都是多任务的:每个线程都从处理器获得一个时间共享。它实际上不是并发执行,但考虑到处理器每秒可以处理数千个请求,它是一个“明显”的并发执行。

    所以是的,如果情况需要的话,在一个处理器上多线程是有意义的。

        8
  •  1
  •   jparanich    16 年前

    我发现,当编写通过网络处理较大数据集的数据解析器时,最好为字母表中的每个字母(与数据相关)创建一个线程,并使程序更受CPU和内存限制。通过网络和磁盘操作继承I/O有界性是一个主要的瓶颈,因此您也可以“开始”其他数据文件,而不是按顺序进行工作。

    在四核上,启动四个以上的线程当然是有意义的。这4个线程不太可能分布在多个核心上,特别是在当今的处理器速度下。

        9
  •  1
  •   Daniel Lidström    14 年前

    根据Herb Sutter(并发性方面的主要专家之一)的说法, Pillars of Concurrency 通过异步代理进行响应和隔离 . 总结如下:

    通过独立运行任务和异步运行任务,通过消息进行通信来保持响应。

    伟大的文章(以及整个系列!)我还在等那本书。