【问题标题】:How to make a program not utilize 100% cpu?如何使程序不使用 100% cpu?
【发布时间】:2013-07-17 08:51:46
【问题描述】:

有 5 个线程在无限循环中运行。

其中2个会在队列不为空时发送消息。

其中 4 个将在 5 分钟内持续发送心跳。

其中1个是从另一个来源请求数据。

当它使用 100% 的 CPU 时,我无法在窗口中使用任何其他应用程序。整个窗口变得很慢。

编辑:Sleep 可以放在 WaitOne 之后吗?

if(autoEvent.WaitOne())
{
}
else
{
}
Thread.Sleep(100);

sleep 可以放在作为 ZeroMQ 的subscriber.Recv() 之后吗?

如果没有 Recv(),所有线程我都会休眠,但是有一个线程我不敢在只有 client.Send 的实时数据馈送线程中休眠,只有一个线程会导致 100% 吗?

【问题讨论】:

  • 贴一些代码,特别是无限循环当队列不为空时
  • 问得好,但我觉得主要是MS Win Machines的问题,我的Win7真的很重,好像是在玩CPU,用了1G!在所有服务都已禁用时的内存。

标签: c# multithreading windows-services threadpool


【解决方案1】:

问:如何让程序不使用 100% CPU?

答:不要创建繁忙的循环!!!!

阻止是好的。有很多方法可以完成“阻塞直到有事可做”。包括使用警报信号或计时器(很差,但有明显的改进)、超时读取套接字(如果您碰巧收到网络套接字通知)或使用超时的 Windows 事件对象。

如果其他方法都失败了,您始终可以使用“Sleep()”。如果可以避免,我会不鼓励使用“睡眠”——几乎总是有更好的设计策略。但它让你远离 100% CPU 繁忙的循环;)

========================================

附录:您发布了一些代码(谢谢!)

你正在使用 xxx.WaitOne()。

只需使用 WaitOne() (阻塞调用),超时。这是一个理想的解决方案:无需繁忙循环,无需“睡眠”!

http://msdn.microsoft.com/en-us/library/aa332441%28v=vs.71%29.aspx

【讨论】:

  • 如果在waitone中放入new TimeSpan(0, 0, 1)而不丢失信号,那就太好了
  • 如果可能的话,所有线程我都休眠了,但是有一个线程我不敢在只有客户端的实时数据馈送线程中休眠。发送,只有一个线程会导致 100% 吗?
  • 问:只有一个线程会导致 100% 的 CPU 利用率吗?答:是的;)为什么不呢?
【解决方案2】:

将 System.Threading.Thread.Sleep(100)(100 毫秒睡眠 = 系统执行其他操作的时间)放入无限循环中。

【讨论】:

  • 在它之后休眠会影响subscriber.Recv(),我只是怕它丢失了一些消息
  • 你能显示一些代码吗? Recv() 函数可能已经在休眠,直到它接收到数据
  • 据我所知,在使用subscriber.Recv() 的线程中不需要睡眠
  • 你是对的,但是有一个线程没有 Recv() 是发布者只是发送消息
【解决方案3】:

对于发送消息的线程,当队列为空时,使用ResetEvent

DeliverMessageThread_DoWork
{
  while(true)
  {
    if(GetNextMessage() == null)
      MyAutoResetEvent.WaitOne(); // The thread will suspend here until the ARE is signalled
    else
    {
      DeliverMessage();
      Thread.Sleep(10); // Give something else a chance to do something
     }
  }
}

MessageGenerator_NewMessageArrived(object sender, EventArgs e)
{
   MyAutoResetEvent.Set(); // If the deliver message thread is suspended, it will carry on now until there are no more messages to send
}

这样,您不会有 2 个线程一直占用所有 CPU 周期

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多