我有许多线程(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 之类的东西,它不使用处理器时间,然后超时,则没有理由在线程中延迟睡眠。
您的用户不会等待线程响应,它不会使用处理器时间,并且其他线程不会被阻止,因此没有理由让线程休眠。
正如 David Heffernan 在他的评论中指出的那样,如果现在没有使用 100% 的 CPU,那么就没有问题。
如果您是单线程并且您必须偶尔在等待串行端口响应之间响应用户,则可以使用 sleep()。
此外,让线程休眠并不会提高效率。它只会将处理器周期让给其他线程。
看一眼sleep(0)
作为在线程中“浪费时间”的 CPU 有效方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)