我有许多线程(100 个),每个线程一次执行几秒钟。当它们执行时,它们花费大量时间等待另一个系统(串行设备)的响应。我注意到,同时执行 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 串行库)并通过驻留在传入字符缓冲区上等待字符返回,当它们到达时对其进行处理。我想串行库可以使设备读取和写入。线程中的时间长则一分钟,短则几秒,但大部分时间都花在等待字符离开端口,或者等待响应字符(波特率慢),因此我的问题是线程在等待时的最佳行为方式。目前,我正在循环中调用 Sleep
等待 CharactersInBuffer
变为非零,在每个字符到达时对其进行处理,并在获得完整响应时退出线程。所以代码看起来更像(忽略超时处理等):
send command ;
Packet = '' ;
repeat
repeat
Sleep (20) ;
until response character arrived ;
build Packet
until complete packet arrived
process response ;
最佳答案
如果线程确实正在等待类似 WaitForSingleObject 之类的东西(不使用处理器时间),然后超时,则没有理由通过 sleep 来延迟线程。
您的用户不会等待线程响应,它不会使用处理器时间,并且其他线程不会被阻止,因此没有理由让线程休眠。
正如 David Heffernan 在评论中指出的那样,如果现在没有使用 100% 的 CPU,那么就没有问题。
如果您是单线程并且必须偶尔在等待串行端口响应之间响应用户,则可以使用 sleep()。
此外,让线程休眠并不会提高效率。它只会将处理器周期让给其他线程。
看看 sleep(0)
作为在线程中“浪费时间”的 CPU 有效方式。
关于multithreading - 在线程中获取 "waste time"最高效的 CPU 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7971671/