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

时间:2014-12-19 00:01:45

标签: c# multithreading winforms

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

enter image description here

.NET框架是否有某种功能可以将该单个线程的工作(自动)划分到其他CPU中?

7 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

  

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

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

  

.net框架是否有将工作划分为其他CPU的工具?

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

单线程应用程序仅在CPU的一个核心上运行,因此它的工作方式是当你拥有多个CPU时,只需获得更多内核就可以让你的pc更强大。您只能在所有CPU上使用一个核心。

答案 5 :(得分:-1)

我知道这是一个旧线程,但我带着同样的问题来到这里,并且有不同的原因/解决方案。

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

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

答案 6 :(得分:-2)

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

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

您是否研究过Task,这是一种创建线程的简单方法

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