如何在使用while(1)循环时达到100%时减少CPU使用率

时间:2013-06-14 10:41:41

标签: c windows winapi visual-studio-2008 while-loop

我正在研究UDP服务器/多客户端应用程序。

有多个线程处理多个客户端。

有一个单独的线程继续向每个活动客户端发送KEEPALIVE消息。由于此线程在while(1)中,因此CPU使用率达到100%。

由于我希望继续使用此功能,因此我使用了while(1)线程。我也尝试在每次执行时添加一个睡眠,但我不认为sleep()释放CPU。有没有办法可以减少特定时间的CPU使用率。例如,在单次执行while之后,我可以将CPU释放10秒,然后继续返回。

请帮帮我。非常感谢。

4 个答案:

答案 0 :(得分:5)

sleep - 暂停执行当前线程,直到超时间隔结束。 并将处理器提供给准备运行的其他线程。

来源:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx

所以,只需sleep即可完成所有工作。

答案 1 :(得分:3)

while(1)循环中发送保持活动消息是个坏主意,因为您不仅要刻录所有CPU时间,还要充斥网络并闯入这些消息的收件人。您可以使用Sleep() WinAPI函数以合理的延迟(建议您看起来合理的10秒)暂停发送线程一段时间:

while( 1 ) {
   sendKeepAlive();
   Sleep( 10 * 1000 ); // 10 seconds
}

Sleep()肯定会挂起你的线程,当线程被挂起时,它不会占用CPU时间。

答案 2 :(得分:1)

而非睡眠尝试int usleep(useconds_t usec);

http://pubs.opengroup.org/onlinepubs/7908799/xsh/usleep.html

对于Windows特定的,您可以尝试timeBeginPeriod / timeEndPeriod.See链接 - http://www.geisswerks.com/ryan/FAQS/timing.html

答案 3 :(得分:0)

在Linux上我使用nanosleep()然后sleep():nanosleep(&tsleep,NULL); sleep(1500)

    int period=100000;
    int limit=300;

    struct timespec twork,tsleep; //time to work, and time to sleep
    twork.tv_sec=0;
    twork.tv_nsec=period*limit*1000;
    tsleep.tv_sec=0;
    tsleep.tv_nsec=period*limit*1000;