【问题标题】:Are single-threaded applications a dead technology? [closed]单线程应用程序是一种死技术吗? [关闭]
【发布时间】:2009-01-08 16:35:49
【问题描述】:

我刚买了一台价格低于 1,000 美元的新笔记本电脑,它的目标客户是非开发人员市场的消费者,查看规格后,我惊讶地发现它标配双核处理器。

这让我想到了一个问题:随着多核机器成为常态,编写单线程应用程序是否曾经正确?

除了可以合理预期完全适合将在其上运行的最弱系统的单个处理器的单个内核中的琐碎应用程序之外,在所有一个线程中运行的应用程序是否会因现代操作系统的方式而严重退化当应用程序没有提供关于如何优化这种拆分的指导时,将它们的执行分散到内核中?

【问题讨论】:

  • 为什么你会假设每个应用程序都必须使用所有可用的内核?您还在使用非多任务操作系统吗?

标签: multithreading concurrency


【解决方案1】:

由于线程总是给应用程序增加额外的复杂性,我相信单线程应用程序将永远占有一席之地。

即使单核处理器完全过时,单线程编程也不会消失。

双核,尤其是在消费市场,非常适合多任务处理。如果每个应用程序都使用每个处理器内核,那么我们可能会遇到与单核处理器相同的问题。

我说不要发疯,开始多线程处理一切。 除非有充分的理由,否则请将其保留在一个线程中。

【讨论】:

  • 另外,有时您不希望您的程序使用所有 CPU。例如,企业库存软件通常不会显着影响机器的可用性。反过来,承担线程的复杂性是不值得的。
  • 永远不要忘记多个单线程应用程序可以使用多个内核。不要害怕将复杂性委托给操作系统。
【解决方案2】:

您不应该使用多线程,除非应用程序需要是多线程的。

仅仅因为你可以多线程并不意味着你应该。多核/处理器并没有真正改变这一事实。

【讨论】:

  • 我和其他人一样了解旧谣言。这个问题(部分)分解为“'需要多线程'的定义是否改变了?
  • @Jekke:我的回答是否定的。没有区别。
  • 我应该补充一点,如果您甚至考虑为应用程序添加线程是因为人们拥有多个内核,而不是因为不同的需要而产生的合理判断对于线程,你真的没有使用线程的事情。
  • Donald Knuth 在接受采访时表示,在他编写的所有程序中,只有一个可以从多线程中受益。也许吧。
  • @Carl:确实。令人惊讶的是,人们对线程的无知程度。
【解决方案3】:

多线程应用程序更难编写和维护。由于硬件和技术堆栈的进步,我认为您将开始看到更多利用多线程的应用程序。

Microsoft 有一组扩展,我相信它们正在添加到运行时中,称为 ??Parallels??我知道他们将启用 LINQ 的版本称为 PLINQ。从本质上讲,它试图从多线程算法中移除许多容易出错的管道。

不过,只有时间可以证明,我敢打赌,仍然有大量单线程应用程序存在,因为它们没有算法可以证明旋转线程的性能成本是合理的。

【讨论】:

    【解决方案4】:

    ...如果应用程序没有提供有关如何优化这种拆分的指导,现代操作系统将其执行分布在内核之间的方式会严重降低在所有一个线程中运行的应用程序的性能吗?

    不,它仍然会像以前在单核 CPU 上一样运行。

    【讨论】:

    • 我很想将此作为公认的答案,因为我认为这是唯一在回答问题时指出了一个关键事实:无论操作系统在做什么默认切片,它只会使处理在严重退化的情况下,比在单核机器上更糟糕。干得好。
    • 同意!!!除非这两个进程将花费 cpu 周期“等待”外部(到盒子)资源,如打印机、互联网连接、数据库或 ...
    • 线程与性能无关,它与处理阻塞情况有关......这是 Jekke 真正不明白的部分......
    • @Rich 线程和多 CPU 有很多作用: 处理阻塞(即如果一个线程必须阻塞,那么让它成为工作线程而不是阻塞的 UI 线程);增加容量(同时在多个 CPU 上处理相同数据的不同部分);并避免被抢占。
    • @ChrisW:我理解,但是认为多核机器上的性能是线程的一个原因是一个根本缺陷,这就是我在 Jekke 的想法中试图解决的问题。
    【解决方案5】:

    硬件并没有真正改变特定应用程序中的任何任务将阻塞或不阻塞的事实,而这实际上将决定您是否应该使用多线程。

    但是,现代编程语言正在添加新功能,以便程序员更轻松、更安全地实现线程应用程序。例如 Cocoa 有 NSOperationQueue 抽象了工作线程模型,并且在 OS X 的下一个版本中会有更多的改进。除了更容易实现简单的线程模型之外,NSOperationQueue 还以总数的方式管理线程线程数适合处理器和内核的数量,因此,如果您的应用程序使用大量线程,则无需太多额外工作即可显着提高速度。

    【讨论】:

      【解决方案6】:

      宣传多核是为了用户的利益,而不是程序员。用户会被告知拥有多个内核意味着他们可以同时运行多个复杂的应用程序,例如在 Excel 中更新大型电子表格并查看 Powerpoint 演示文稿等。

      显然,作为开发人员,您可以充分利用额外的内核;大多数视频编辑包在多核机器上运行得更快。

      如果您正在编写的应用程序可以从使用更多内核中获益,那么投入额外的开发时间可能是值得的,因为现在大多数新机器都有多个内核,但一如既往地考虑投资回报率。

      【讨论】:

        【解决方案7】:

        毫无疑问,并行编程将在未来取得很大进展,因为 CPU 不会变得更快,我们只会拥有很多。双核或四核只是开始,在不久的将来会有更多处理器的系统(目前有 256 核的 CPU,Windows 7 将支持此类处理器)。

        但是,我认为并行性并不适合解决任何问题,它需要不同的编程风格。使用当前技术,多线程为应用程序增加了相当高的复杂性。因此,诸如函数式编程以及支持并行化的库/编译器等范例在未来将变得越来越重要。

        David Callahan 在 MSDN 杂志上发表了一篇关于并行编程的设计考虑转变的有趣文章:Paradigm Shift: Design Considerations For Parallel Programming

        【讨论】:

          【解决方案8】:

          目前,多线程编程有些困难、容易出错且难以测试(测试竞态条件并不容易)。因此,应该留到优势克服劣势的时候。

          许多程序的运行速度足以满足几乎所有目的,并且不需要任何性能改进。有些需要一段时间,但由于不真正涉及 CPU 并且不会被多线程改进的原因。对于这些,使用多个线程会使它们更难开发,同时对最终用户没有帮助。

          与此同时,多核在没有多线程的情况下也很有用。大多数操作系统都有多个进程在运行(监控、后台管理、病毒、间谍软件、垃圾邮件程序等),并且允许这些进程在另一个内核上运行可以腾出一个内核供用户代码使用。

          【讨论】:

          • 通过测试找到竞争条件不仅仅是“不容易”。一般情况下是不可能的。
          • @Die in Sente:你让我希望我能对 cme​​ts 投反对票。
          【解决方案9】:

          像往常一样进行性能优化;您不能就任意应用程序是否“足够性能”做出一般性陈述。问题是,对于应用程序 X,它是否“足够性能”。

          但是,也许更能继续看到摩尔定律的好处,即不再使处理器更快,而是使它们更小(因此芯片上的内核更多)应用程序必须成为多线程的。

          但是,构建多线程应用程序(工程、测试、支持)的成本仍然很高,因此除非您需要性能,否则您真的不应该这样做。我认为使用一些不同的库以及函数式编程和优化编译器等进行多线程编程是一些更简单的方法,所以我认为随着我们继续向多核世界过渡,这将变得更容易。

          【讨论】:

            【解决方案10】:

            您的问题的答案很棘手,因为它要求我们推测未来的发展。您的问题的简单答案是这样的:

            不,单线程是多线程的基础,你不能有一个没有另一个。因此,单线程应用程序的容量将永远存在,并且它们无疑会在未来几年内编写。

            复杂的答案如下: 具有双核处理器标准的计算机的原因是因为它是处理器开发的下一步。虽然许多应用程序不会立即利用双核,但有些应用程序会。因此,像英特尔这样的公司必须适应,否则就会被竞争压垮。

            除此之外,还有直接的优势。更大的可寻址内存空间。操作系统本身已经针对双重功能进行了优化,也可以立即获得收益。

            另外:如果您有一个针对双核处理器优化的库,那么所有后续开发都会受益。一个例子是搜索和排序算法(由于数据的可分割性,“线程拆分”的自然选择)可以针对双核进行优化,然后具有优势的永久使用。

            【讨论】:

              【解决方案11】:

              让我们面对现实,大多数应用程序都是为业务编写的,它们访问数据库并允许查看、编辑和附加其中的数据。然后可能是一些数据分析报告等等。

              如果数据库查询需要一段时间,则除了单独的 UI 线程之外,几乎没有理由将其线程化,因为收益将是微不足道的,并且最终用户基本上不会注意到。在少数情况下,并行循环可能会使应用程序受益。

              我相信目前多核的真正好处是多个应用程序同时访问不同的核。想想有多少进程窗口在后台运行,这些进程可以在任意数量的内核上同时运行。

              【讨论】:

                【解决方案12】:

                也许应该将问题重新表述为:“在一个核心上运行程序是一种死技术”。这将使它更普遍。如果您查看最近添加到 Firefox 3.5 和其他主要浏览器中的 Web 工作者,那么它们确实支持多核,但使用进程和消息传递。比线程更明智的方法。最后,这一切都取决于手头的问题。如果手头的问题是受 CPU 限制,那么使用多核确实会产生影响。

                我还想补充一点,您的应用程序可能不是机器上唯一正在运行的进程(提示)。

                【讨论】:

                  【解决方案13】:

                  在不使用多线程的情况下使用多个处理器的好方法:

                  cat data.txt | sed 's/,/ /g' | awk '{print $4}' | gzip > foo.txt.gz
                  

                  这是否回答了您关于天气双核意味着所有应用程序都应该是多线程的问题?以上理论上可以使 3 个 CPU 饱和。 (不包括 cat,只使用它,因为这会使该行更具可读性)

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-01-04
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-08-19
                    相关资源
                    最近更新 更多