问个线程里面有while(TRUE)循环的问题。

mill888 2007-05-30 06:40:49
我在用delphi写IOCP程序的时候,在工作者线程函数里面我是这么写的
function ServerWorkerThread(CompletionPortID:Pointer):Integer;stdcall;
begin

while(TRUE) do
begin

GetQueuedCompletionStatus().............
........
....

end;

end;

这个时候运行程序导致程序占用掉所有的CPU,CPU使用率达到100%;
如果我在while(TRUE)循环体里面加个sleep(2),如下:

while(TRUE) do
begin

GetQueuedCompletionStatus().............
........
....
sleep(2);
end;

则CPU就正常了;可是这样就是让工作者线程sleep一会儿,应当会影响到服务器的执行效率的。

应当不是我的程序问题,我在写其他程序的时候,如果是用到线程,且里面有这种while(TRUE)的时候,总是要sleep(2),才不会导致CPU %。

不知道为什么?
难道是delphi 7的问题??我看很多用VC写的IOCP的例子里面,都是直接while(TRUE),没有sleep的,他们的CPU都很正常啊。
...全文
978 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZyxIp 2007-06-05
  • 打赏
  • 举报
回复
执行效率并不是说一直做检查就是效率高.

要知道在循环中大多数的检查都是没有值,空检查的。应该提高检查次数和有数据的比率才是正确的利用CUP资源。你的SLEEP时间太短的话,系统将很多时间都浪费在线程的切换上了。
mill888 2007-06-04
  • 打赏
  • 举报
回复
sleep(0)不行啊,还是CPU 100%,sleep(2) CPU虽然没有100%,可是还是很高,sleep(100)的法CPU就很低了。
mill888 2007-06-04
  • 打赏
  • 举报
回复
我感觉让线程sleep一会儿,不管这一会儿是多少,都会影像到服务器的执行效率的,
如果不sleep,CPU就会100%。
ZyxIp 2007-06-04
  • 打赏
  • 举报
回复
循环中去做这个检查应该是没有必要一直循环,应该有个时间间隔。将这个参数做成可以设置改变的吧。

因为很少说需要2毫秒去检查一下是否有数据发来的。100毫秒检查一下也并不会给用户感觉说服务器反应比较慢。
jadeluo 2007-06-04
  • 打赏
  • 举报
回复
sleep(1)就够了。
gege45 2007-05-30
  • 打赏
  • 举报
回复
摘自MSDN:

A thread can relinquish the remainder of its time slice by calling this function with a sleep time of zero milliseconds.


gege45 2007-05-30
  • 打赏
  • 举报
回复
sleep(0)也可以

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧