Multithreading 多线程有什么意义吗?

Multithreading 多线程有什么意义吗?,multithreading,Multithreading,我不想让这个主观化 如果I/O和其他与输入/输出相关的瓶颈不值得关注,那么我们需要编写多线程代码吗?从理论上讲,单线程代码将运行得更好,因为它将获得所有的CPU周期。对吧? 如果JavaScript或ActionScript是多线程的,它们的表现会更好吗 我只是想了解多线程的真正需求。我不知道你最近(过去5年)是否注意到了硬件的发展趋势,但我们正走向一个多核世界 这篇文章给我们敲响了警钟 在双核PC上,单线程应用程序只能获得一半的CPU周期。CPU不再变得更快,摩尔定律的这一部分已经消失。用赫伯

我不想让这个主观化

如果I/O和其他与输入/输出相关的瓶颈不值得关注,那么我们需要编写多线程代码吗?从理论上讲,单线程代码将运行得更好,因为它将获得所有的CPU周期。对吧?

如果JavaScript或ActionScript是多线程的,它们的表现会更好吗


我只是想了解多线程的真正需求。

我不知道你最近(过去5年)是否注意到了硬件的发展趋势,但我们正走向一个多核世界

这篇文章给我们敲响了警钟


在双核PC上,单线程应用程序只能获得一半的CPU周期。CPU不再变得更快,摩尔定律的这一部分已经消失。

用赫伯·萨特的话来说,即未来的计算性能路径将是更多的内核,而不是更高的时钟速度。问题是,添加更多内核通常不会提升非多线程软件的性能,即使如此,它也完全取决于多线程编程技术的正确使用,因此多线程是一件大事


另一个明显的原因是维护响应GUI,例如,点击按钮启动大量计算或可能需要一段时间的I/O操作,正如您自己所指出的。

许多多线程处理只是为了在执行阻塞操作时简化编程模型,同时保持程序中的并发性-有时语言/库/API给您提供了很少的其他选择,或者其他选择会使编程模型太难并且容易出错


除此之外,多线程的主要好处是利用多个CPU/核心-一个线程一次只能在一个处理器/核心上运行。

否。您不能继续获得新的CPU周期,因为它们存在于不同的核心上,而单线程应用程序所在的核心不会更快。另一方面,多线程应用程序将受益于另一个核心。在双核上,编写良好的并行代码的速度可以提高约95%,而双核是过去五年中所有新的CPU。这是四核的两倍。因此,虽然你的单线程应用程序没有五年前那么多的周期,但我的四线程应用程序的周期是五年前的四倍,并且在响应时间和性能方面远远超过了你的应用程序。

如果我们只有单核,你的问题是正确的。但问题是,现在我们主要使用多核CPU。如果您有一个四核,并且编写了一个单线程程序,那么您将有三个程序不使用的核


所以实际上,您最多有25%的CPU周期,而不是100%。由于现在的技术是增加更多的内核和更少的时钟速度,线程将对性能越来越重要。

现在我使用多线程的主要原因是在程序执行耗时的操作时保持UI的响应性。当然,这不是高科技,但它让用户感到高兴:-)

这有点像是问如果我只需要钉这个钉子,是否需要螺丝刀。多线程是工具箱中的另一个工具,可用于从中受益的情况。它不一定适用于所有编程情况。

现在大多数CPU都是多核的。简言之,这意味着它们在同一个芯片上有多个处理器

如果您只有一个线程,则只能使用其中一个核心-其他核心将空闲或用于正在运行的其他任务。如果您有多个线程,那么每个线程都可以在自己的核心上运行。您可以将问题分成X个部分,并且假设每个部分都可以独立运行,您可以在接近正常所需时间的1/X的时间内完成计算

根据定义,并行运行的最快算法所花费的CPU时间至少与最快的顺序算法相同——也就是说,并行化不会减少所需的工作量——但工作分布在几个独立的单元上,从而减少了解决问题所花费的实时时间。这意味着用户不必等那么久的答案,他们可以更快地前进

10年前,当多核是闻所未闻的,那么它是真的:如果我们忽略I/O延迟,你将一无所获,因为只有一个单元来执行。然而,提高时钟速度的竞赛已经停止;我们正在研究多核,以增加可用的计算能力。随着像Intel这样的公司在寻找80核CPU,您越来越需要考虑并行化以减少解决问题的时间-如果您只有一个线程,您只能使用一个内核,而其他79个内核将做其他事情,而不是帮助您更快地完成任务。

以下是一些答案:

  • 你写“如果输入/输出相关的问题不是瓶颈……”。这是一个很大的“如果”。许多程序确实存在这样的问题,记住网络问题包含在“IO”中,在这种情况下,多线程显然是值得的。如果你正在编写一个罕见的没有IO和通信的应用程序,那么多线程可能不是问题
  • “单线程代码将获得所有CPU周期”。不一定。多线程代码可能比单线程应用程序获得更多的周期。如今,应用程序几乎不再是系统上运行的唯一应用程序
  • 多线程技术允许您利用多核系统,这些系统现在几乎已经普及
  • 多线程允许您在某些操作发生时保持GUI响应。即使您不希望两个用户启动的操作同时发生,您也可能希望GUI能够在计算时重新绘制并响应其他事件