【问题标题】:How can an endless loop within a thread be prevented from consuming all CPU resources?如何防止线程内的无限循环消耗所有 CPU 资源?
【发布时间】:2012-11-11 07:10:51
【问题描述】:

我编写了一个 .NET 应用程序,该应用程序生成一个线程,该线程在检查以确保某些条件为真时无限循环。任务管理器显示,在生成此线程的那一刻,应用程序几乎使用了所有可用的 CPU 资源,只要线程运行,这就是应用程序的生命周期。

如何防止该线程占用如此多的 CPU 资源?

【问题讨论】:

    标签: .net multithreading cpu cpu-usage


    【解决方案1】:

    如果您必须等待来自其他线程的数据,请使用监视器: http://msdn.microsoft.com/de-de/library/system.threading.monitor%28v=vs.80%29.aspx

    如果这不可行,您可以考虑在 while 循环中添加睡眠时间,例如 10 毫秒。 这应该会有所帮助。

    while(true) {
         //Do something here
         Thread.Sleep(10); //Don't consume whole CPU
    }
    

    另见以下相关帖子:Thread.Sleep or Thread.Yield

    【讨论】:

    • 像这样的 Sleep() 循环会在检查“某些条件”时引入平均 5ms 的延迟,并且仍然会浪费一些 CPU。在所有线程间通信的 99.9% 中,它应该被通过内核同步机制的线程间信号替换(正如 usr 所建议的那样)。我不会反对,因为它会起作用,(很糟糕),而且因为 0.1% 的人别无选择。
    【解决方案2】:

    防止消耗 CPU 的最佳方法是等到所需条件为真。使用某种同步原语来协调您的线程。一个活动将是一个好的开始。

    【讨论】:

      猜你喜欢
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多