Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当使用while(1)循环时,当CPU使用率达到100%时,如何降低CPU使用率_C_Windows_Winapi_Visual Studio 2008_While Loop - Fatal编程技术网

当使用while(1)循环时,当CPU使用率达到100%时,如何降低CPU使用率

当使用while(1)循环时,当CPU使用率达到100%时,如何降低CPU使用率,c,windows,winapi,visual-studio-2008,while-loop,C,Windows,Winapi,Visual Studio 2008,While Loop,我正在处理UDP服务器/多客户端应用程序 有多个线程处理多个客户端 有一个线程持续向每个活动客户端发送KEEPALIVE消息。由于该线程处于状态,而(1)状态,因此CPU使用率达到100% 因为我想继续使用这个功能,所以我使用了while(1)线程。我还尝试在每次执行while时添加sleep,但我认为sleep()不会释放CPU。有什么方法可以在特定的时间内减少CPU的使用。e、 g执行一次while后,我可以释放CPU大约10秒,然后继续返回while 请帮帮我。提前多谢。请尝试int-us

我正在处理UDP服务器/多客户端应用程序

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

有一个线程持续向每个活动客户端发送KEEPALIVE消息。由于该线程处于
状态,而(1)
状态,因此CPU使用率达到100%

因为我想继续使用这个功能,所以我使用了
while(1)
线程。我还尝试在每次执行
while
时添加
sleep
,但我认为
sleep()
不会释放CPU。有什么方法可以在特定的时间内减少CPU的使用。e、 g执行一次while后,我可以释放CPU大约10秒,然后继续返回
while


请帮帮我。提前多谢。

请尝试
int-usleep(useconds\u t-usec)代替睡眠


对于特定于windows的线程,您可以尝试使用timeBeginPeriod/timeEndPeriod。请参阅链接—

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

资料来源:

所以,只要
睡眠
就可以了。

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


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

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

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

Sleep()
会存储上下文+放弃CPU以节省资源,减少CPU使用的一种方法是限制线程数,最好的方法是在执行之前保留一个等待列表谢谢大家的帮助:)谢谢大家的帮助:)这在Windows上也可用吗?是的,在Windows上有一个
睡眠(毫秒)
功能(在Windows.h中)。@RogerRowland是的,你是对的,Windows中没有usleep,但是对于特定于windows的用户可以浏览此链接,我认为是这样的-只是OP标记了windows。@RogerRowland我已经按照您的建议编辑了我的答案。希望它对OP有所帮助
while( 1 ) {
   sendKeepAlive();
   Sleep( 10 * 1000 ); // 10 seconds
}