我正在研究UDP服务器/多客户端应用程序。
有多个线程处理多个客户端。
有一个单独的线程继续向每个活动客户端发送KEEPALIVE消息。由于此线程在while(1)中,因此CPU使用率达到100%。
由于我希望继续使用此功能,因此我使用了while(1)线程。我也尝试在每次执行时添加一个睡眠,但我不认为sleep()释放CPU。有没有办法可以减少特定时间的CPU使用率。例如,在单次执行while之后,我可以将CPU释放10秒,然后继续返回。
请帮帮我。非常感谢。
答案 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;