multithreading - 在线程中获取 "waste time"最高效的 CPU 方式是什么?

标签 multithreading delphi sleep delphi-2006 thread-sleep

我有许多线程(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/

相关文章:

python - boost python sleep wrapper导致整个python程序进入休眠状态

ios - 更新按钮 UIImage 而计数器减少 iOS

c++ - Poco RefCountedObject 线程安全吗?

macos - 使用BorderStyle bsNONE移动表格吗?

delphi - 如何将 PDF 转换为 BMP/PNG/JPG 等

java - 覆盖 Thread.sleep()

.net - 为什么我无法更改 .NET 中的 Thread.Name?

c++ - 如何使用 boost::bind 将 io_service 对象传递给新线程?

c# - 线程会自动关闭吗?

delphi - 检测 TWebModule 内存泄漏