将线程保持最佳状态?

时间:2008-09-25 07:03:25

标签: windows multithreading delphi winapi

应用程序有一个辅助线程。这个线程并不是一直在运行,但是主流程可以经常调用它。

所以,我的问题是,在CPU性能方面哪个更优:在没有使用时挂起线程还是保持活动状态并使用WaitForSingleObject函数来等待来自主进程的信号?

6 个答案:

答案 0 :(得分:15)

就使用的CPU资源而言,两个解决方案都是相同的 - 挂起的线程和在WaitForSingleObject中等待未发出信号的对象的线程都没有CPU周期。

也就是说,WaitForSingleObject几乎总是一个首选的解决方案,因为使用它的代码将更“自然” - 更容易阅读,更容易正确。挂起/恢复线程可能是危险的,因为你需要非常小心,以确保你知道你暂停一个线程处于暂停它不会造成伤害的状态(想象暂停一个当前持有互斥锁的线程)。

答案 1 :(得分:6)

我认为Andrei不使用Delphi编写.NET,因此Suspend不会转换为System.Threading.Thread.Suspend而是转换为SuspendThread Win32 API。

我强烈反对。如果您在任意时刻暂停该线程,那么您不知道将发生什么(例如,您可能在某种状态下暂停该线程,某些共享资源被阻止)。如果您已经知道线程处于可挂起状态,那么只需使用WaitForSingleObject(或任何其他WaitFor调用) - 它将与挂起线程一样有效,即线程将使用零CPU时间直到它被唤醒。

答案 2 :(得分:1)

“暂停”是什么意思? WaitForSingleObject将挂起线程,即它不会消耗任何CPU,直到信号到达。

答案 3 :(得分:1)

如果它是一个工作线程,其外部具有工作单元,它肯定应该使用信令对象,因为这将确保它不会不必要地使用CPU。

如果它还有自己的工作要做,这是另一回事。我不会挂起另一个线程的线程(如果有两个线程为它提供工作会发生什么?) - 我的基本规则是线程应该通过其他线程的建议控制自己的生命周期。这将本地化线程本身的所有控件。

答案 4 :(得分:1)

请参阅Delphi中有关多线程的优秀教程: Multi Threading Tutorial

答案 5 :(得分:0)

另一种选择是Delphi 2009中引入的TMonitor,它具有Wait,Pulse和PulseAll等功能,可以在没有任何操作时保持线程处于非活动状态,并在应该继续工作时立即通知它们。在Java中对象锁定后,它是松散建模的。就像那里一样,Delphi对象现在有一个“锁定”字段,可用于线程同步。

可以在http://delphihaven.wordpress.com/2011/05/04/using-tmonitor-1/

找到为线程队列类提供示例的博客

不幸的是,TMonitor实现中存在一个错误,似乎在XE2中修复了