简体   繁体   中英

How to make a program not utilize 100% cpu?

There are 5 threads running in an infinite loop.

2 of them will send messages when queue is not empty.

4 of them will keep sending heartbeat within 5 minutes.

1 of them is to request data from another source.

When it utilizes 100% of the CPU, I can not use any other applications in the window. The whole window becomes very slow.

EDIT: can sleep be put after WaitOne?

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

Can sleep be put after subscriber.Recv() which is ZeroMQ ?

all threads i put a sleep if no Recv(), however there is one thread i do not dare to put a sleep in realtime datafeed thread which has only client.Send, will just one thread cause 100% ?

Q: How to make a program not utilize 100% CPU?

A: Don't create a busy loop!!!!

Blocking is Good. There are lots of ways to accomplish "block until there's something to do". Including using an alarm signal or timer (poor, but a definite improvement), doing a socket read with a timeout (if you happen to be notified with a network socket) or using a Windows Event object with a timeout.

Failing all else, you can always use a "Sleep()". I would discourage using "Sleep" if you can avoid it - there are almost always much better design strategies. But it will keep you from a 100% CPU busy loop ;)

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

Addendum: you posted some code (thank you!)

You're using xxx.WaitOne().

Just use WaitOne() (a blocking call), with a timeout. This is an IDEAL solution: no busy loop, no "Sleep" required!

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

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

For the threads that send messages, when the queue is emtpy, use a 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
}

This way, you won't have 2 threads chewing up all of the CPU cycles all of the time

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM