2

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

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

有一个线程不断向每个活动客户端发送 KEEPALIVE 消息。由于这个线程在while(1)所以 CPU 使用率达到 100%。

由于我希望继续使用此功能,因此我使用了一个while(1)线程。我还尝试sleep在每次执行后添加一个,while但我认为不会sleep()释放 CPU。有什么办法可以减少特定时间的 CPU 使用率。例如,在执行一次 while 后,我可以释放 CPU 大约 10 秒,然后继续回到while.

请帮我。提前非常感谢。

4

4 回答 4

5

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

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

所以,只做sleep你需要的一切。

于 2013-06-14T10:51:27.047 回答
3

在循环内发送保持活动消息while(1)是个坏主意,因为不仅会消耗所有 CPU 时间,还会淹没网络并攻击这些消息的接收者。您可以使用Sleep()具有合理延迟(您建议的 10 秒看起来很合理)的 WinAPI 函数来暂停您的发送线程一段时间:

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

Sleep()肯定会暂停您的线程,并且当线程暂停时,它不会消耗 CPU 时间。

于 2013-06-14T11:02:46.393 回答
1

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

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

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

于 2013-06-14T10:49:58.903 回答
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;
于 2013-06-14T10:58:54.093 回答