多线程是否有意义?

时间:2010-08-05 14:11:53

标签: multithreading

我不想让这个主观......

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

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

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

11 个答案:

答案 0 :(得分:13)

我不知道你最近是否关注硬件趋势(过去5年),但我们正在走向多核世界。

这篇"The free lunch is over"文章是一般的警钟。

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

答案 1 :(得分:8)

用Herb Sutter The free lunch is over的话来说,即计算的未来表现路径将是更多核心而不是更高的时钟速度。问题是添加更多内核通常不会扩展非多线程软件的性能,即使这样,它也完全取决于多线程编程技术的正确使用,因此多线程是一个大问题。

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

答案 2 :(得分:7)

这些天我使用多线程的主要原因是在程序执行耗时的过程中保持UI响应。当然,它不是高科技,但它让用户满意: - )

答案 3 :(得分:4)

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

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

根据定义,并行运行的最快算法将花费至少与最快的顺序算法一样多的CPU时间 - 也就是说,并行化不会减少所需的工作量 - 但是工作分布在几个独立的单元中,领先减少解决问题的实时时间。这意味着用户无需等待答案,他们可以更快地继续前进。

10年前,当多核心闻所未闻时,那是真的:如果我们忽视I / O延迟你就什么也得不到,因为只有一个单元可以执行。但是,提高时钟速度的竞争已经停止;而我们正在考虑使用多核来增加可用的计算能力。对于像英特尔这样的公司来看80核CPU,看待并行化以减少解决问题的时间变得越来越重要 - 如果你只有一个线程,你只能使用那个核心,而另一个核心核心将做其他事情,而不是帮助你尽快完成。

答案 4 :(得分:3)

多线程的大部分工作只是为了使编程模型在执行阻塞操作时更容易,同时保持程序的并发性 - 有时语言/库/ apis给你很少的其他选择,或者替代方案使得编程模型太难以及容易出错

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

如果我们只有单核,那么你的问题是有效的。但事情是,我们现在大多数都拥有多核CPU。如果你有一个四核并编写一个单线程程序,你将有三个核心,你的程序不会使用它。

实际上,您实际上最多只有25%的CPU周期,而不是100%。由于当今的技术是增加更多内核和更低的时钟速度,因此线程对性能将越来越重要。

答案 7 :(得分:1)

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

答案 8 :(得分:1)

以下是一些答案:

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

简而言之,是的,有些应用程序不需要多线程,但它们相当罕见并且变得越来越少。

答案 9 :(得分:1)

首先,现代处理器有多个内核,因此单个thraed永远不会获得所有CPU周期。 在双核系统上,单个线程将仅使用一半的CPU。在8核CPU上,它只使用1/8。

因此从简单的性能角度来看,您需要多个线程来利用CPU。

除此之外,使用多线程也可以更轻松地表达某些任务。

某些任务在概念上是独立的,因此将它们编码为并行运行的单独线程比编写单线程应用程序更为自然,该应用程序将两个任务交错并在必要时在它们之间切换。

例如,您通常希望应用程序的GUI保持响应,即使按下按钮也会启动一些可能需要几分钟的CPU繁重工作流程。在那段时间,您仍然希望GUI工作。表达这一点的自然方式是将两个任务放在不同的线程中。

答案 10 :(得分:0)

这里的大多数答案都会使结论multicore => multithreading看起来不可避免。但是,还有另一种利用多个处理器的方法 - multi-processing。特别是在Linux上,AFAIK,线程实现的过程可能只是一些限制,而且流程比Windows便宜,因此有充分的理由避免多线程。因此,这里存在不应忽视的软件架构问题。

当然,如果并发执行行(线程或进程)需要对公共数据进行操作,则线程具有优势。但这也是线程头痛的主要原因。这样的程序是否可以设计成尽可能多的自主和独立,所以我们可以使用流程?同样,软件架构问题。

我推测今天的多线程就是C时代的内存管理:

  • 很难做到这一点,很容易搞砸。
  • 线程安全漏洞,与内存泄漏一样,很讨厌,很难找到

最后,您可能会发现this article很有趣(请点击页面上的第一个链接)。我承认我只阅读了摘要。