我有许多线程(数百个),每个线程每次执行几秒钟。 当它们正在执行时,它们花费大量时间等待来自另一个系统(串行设备)的响应。 我注意到同时执行100个线程可能是资源消耗过大,所以我实际上限制了可以同时启动的线程数。
我想到了在线程内等待外部事件的好方法和坏方法。这种方法会占用CPU吗?
send command ;
repeat
until response arrived ;
process response ;
这种方法是否可以使其更有效率呢?:
send command ;
repeat
Sleep (20) ;
until response arrived ;
process response ;
* 附加信息 *
该环境为x86 Windows XP。线程代码与串口设备有很长的交互序列,但一般而言,它包括向COM端口写入字符(使用AsyncFree串行库)并等待字符通过在输入字符缓冲区上挂起并在到达时进行处理来返回。我想串行库会进行设备读取和写入。线程时间可能长达一分钟或短至几秒钟,但大部分时间都花费在等待字符离开端口或等待响应字符(波特率较慢),因此我提出了关于线程在等待时最佳行为方式的问题。目前,在等待CharactersInBuffer
变为非零时,我在循环中调用Sleep
,处理每个字符到达时,当我收到完整的响应时退出线程。所以代码看起来更像是这样的(忽略超时处理等):
send command ;
Packet = '' ;
repeat
repeat
Sleep (20) ;
until response character arrived ;
build Packet
until complete packet arrived
process response ;