【问题标题】:Does a single threaded application run on only one CPU单线程应用程序是否仅在一个 CPU 上运行
【发布时间】:2014-12-19 00:01:45
【问题描述】:

我正在 8 CPU 机器上开发单线程应用程序,当发生繁重操作时,CPU 利用率如下所示:

.NET 框架是否具有将单个线程的工作(自动)分配给其他 CPU 的功能?

【问题讨论】:

  • 它是什么样的应用程序?控制台、WPF、WinForms...?
  • 您知道 CPU 和内核是不同的吗?我猜你有 1 个 8 核 CPU 或 2 个 4 核 CPU 而不是 8 个 CPU。
  • @ThomasLevesque,这重要吗?
  • @user4032346。 vs 有这个扩展,可能会帮助你(并发可视化)msdn.microsoft.com/en-us/library/dd537632.aspx
  • @mhs,确实如此;例如,WPF 在单独的线程(绑定、渲染...)上完成部分工作,因此在这种情况下,应用程序并不像 OP 认为的那样“单线程”;)

标签: c# multithreading winforms


【解决方案1】:

不保证任何单个线程总是在同一个内核上运行。但可以保证同时只能在一个核心上运行。但它可以在一个核心上运行直到上下文切换,并在另一个核心上的上下文切换后恢复。您的线程获得的每个时间片都可能分配在另一个内核上。

【讨论】:

    【解决方案2】:

    单线程应用程序是否只在一个 CPU 上运行?

    正如其他人所指出的,不一定。但是,给定线程一次只能在一个核心上运行

    .net 框架是否有一些工具可以将工作分配给其他 CPU?

    是的。 .NET 有Parallel class and Parallel LINQ。请注意,您必须自己划分工作(分成小块),然后 .NET 框架会自动处理多个线程之间的工作平衡。

    【讨论】:

      【解决方案3】:

      即使只有一个线程的进程也可能总是在同一个 CPU 上运行那个线程,也可能不总是。当然,该进程的 CPU 利用率不能超过单个内核的 100%。但是,这 100% 可能分布在与机器上一样多的内核上。所以你可能会看到例如两个不同内核的利用率为 50%,而不是仅一个内核为 100%,四个不同内核为 25%,等等。

      【讨论】:

        【解决方案4】:

        .NET 垃圾收集器将在另一个线程上运行,如果您正在执行 WinForms/WPF,则 GUI 将在其他线程中执行各种工作,以帮助您的单线程应用程序运行得更快。

        【讨论】:

          【解决方案5】:

          单线程应用程序仅在 CPU 的一个核心上运行,因此它的工作方式是当您拥有多个 CPU 时,您只需获得更多核心,从而使您的电脑更强大。您只在所有 CPU 上使用一个内核。

          【讨论】:

            【解决方案6】:

            我知道这是一个旧线程,但我来到这里时遇到了同样的问题,以及不同的原因/解决方案。

            如果您通过 Visual Studio 调试器(此处为 VS2012)启动程序,您的线程似乎绑定到单个内核。为了使用所有可用的内核,我必须直接从可执行文件或 Windows cmd 提示符启动它。

            可能非常具体,但希望对您有所帮助。

            【讨论】:

              【解决方案7】:

              不,它将始终在一个处理器/内核中运行,并且可能会根据调度程序而改变。

              您也可以使用async and await,它们将有助于您的应用程序的流畅性。

              你看过Task,它是一种非常简单的创建线程的方法

              Task.Run(() =>
              {
                  // Do something that will take a long time
                  Thread.Sleep(10000);
              });
              

              【讨论】:

              • 这完全不是重点;这根本不是 OP 所要求的。
              • 我喜欢人们对实际有帮助的东西投反对票,虽然它不是一个完整的答案,但到目前为止的其他答案只是解释了预期的行为(但没有投反对票),并且没有回答以上 2 个问题。
              • OP 询问单线程应用程序是否在单个 CPU 上运行;您的答案显示了如何在另一个线程上运行操作。我不明白这如何回答 OP 的问题...
              • @Oakcool,有帮助吗?没有证据表明这个答案会对 OP 有所帮助。
              • @KirkWoll 它实际上回答了这两个问题。首先,单个线程将使用一个内核,除非处理器调度程序更改它。其次,.NET 是添加“线程”并允许在可用内核上执行某些东西,而 Task 就是其中之一。因此,与 Thomas 所说的相反,他确实是在询问是否可以在另一个线程上运行操作。
              猜你喜欢
              • 2016-05-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多