我正在8 CPU机器上开发单线程应用程序,当发生繁重操作时,CPU利用率如下所示:
.NET框架是否有某种功能可以将该单个线程的工作(自动)划分到其他CPU中?
答案 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);
});