在线程中"浪费时间"的CPU效率最高的方法是什么?

ros*_*mcm 11 delphi multithreading sleep delphi-2006 thread-sleep

我有许多线程(100),每次执行几秒钟.当它们执行时,它们花费大量时间等待来自另一个系统(串行设备)的响应.我注意到一次执行100个线程可能是资源占用,所以我实际上限制了任何时候都可以启动的线程数.

虽然在线程中等待外部事件必须有好的和坏的方法,但我想到了这一点.这种方法是CPU密集型的吗?:

send command ;
repeat
until response arrived ;
process response ;    
Run Code Online (Sandbox Code Playgroud)

这种方法是否会提高效率?:

send command ;
repeat
    Sleep (20) ;
until response arrived ;
process response ;  
Run Code Online (Sandbox Code Playgroud)

*附加信息*

环境是x86 Windows XP.线程代码是一个长期的和涉及一系列与串行设备,但在一般的相互作用,它由写入字符到COM端口(使用AsyncFree串行库)并等待字符由驻留在传入字符缓冲器被返回的和他们到达时处理它们.我想这个串行库会让设备读写.只要在线程的时间可以是一分钟,或短则几秒钟,但大部分时间都花在等待字符离开港口,或等待响应字符(波特率为慢),因此我的问题是关于线程在等待时表现的最佳方式.目前我Sleep在循环中调用等待CharactersInBuffer变为非零,在它到达时处理每个字符,并在我有完整响应时退出线程.所以代码看起来更像(忽略超时处理等):

send command ;
Packet = '' ;
repeat

    repeat
        Sleep (20) ;
    until response character arrived ;
    build Packet

until complete packet arrived
process response ;  
Run Code Online (Sandbox Code Playgroud)

Mar*_*ams 7

如果线程真正等待WaitForSingleObject之类的东西,它不使用处理器时间,那么超时,就没有理由在休眠时在线程中加入延迟.

您的用户没有等待线程响应,它没有使用处理器时间,并且其他线程不会被阻止,因此没有理由让线程进入休眠状态.

正如David Heffernan在评论中指出的那样,如果它现在没有使用100%的CPU,那么就没有问题了.

如果你是单线程的话,你可以使用sleep(),你不得不偶尔在等待串口回应用户之间做出响应.

此外,线程休眠不会使它更有效.它只会产生其他线程的处理器周期.

看一下sleep(0)线程中"浪费时间"的CPU效率方法.