应用程序有一个辅助线程。 这个线程并不是一直运行,但主进程可以经常调用它。
所以,我的问题是,在CPU性能方面什么是最优化的:暂停线程,当它不被使用或保持活着,并使用WaitForSingleObject函数等待来自主进程的信号?
就所使用的CPU资源而言,两种解决方案都是相同的 – 挂起的线程以及在WaitForSingleObject中等待的未被发信号的对象的线程都根本没有CPU周期。
也就是说,WaitForSingleObject几乎总是一个首选的解决方案,因为使用它的代码将更加“自然” – 更容易阅读,更容易做出正确的决定。 挂起/恢复线程可能是危险的,因为您需要非常小心,以确保您知道挂起线程处于暂停状态并不会造成任何危害(想象挂起当前正在持有互斥锁的线程)。
我会假设Andrei不使用Delphi编写.NET,因此Suspend不会转换为System.Threading.Thread.Suspend,而是SuspendThread Win32 API。
我强烈建议不要这样做。 如果你在任意时刻挂起线程,那么你不知道会发生什么事情(例如,你可能会挂起线程处于某种共享资源被阻塞的状态)。 如果你已经知道线程处于可挂起状态,那么只需使用WaitForSingleObject(或任何其他的WaitFor调用) – 挂起线程同样有效,即线程将使用零CPU时间直到被唤醒。
你是什么意思的“暂停”? WaitForSingleObject将挂起线程,即不会消耗任何CPU,直到信号到达。
如果它是一个工作线程在外部赋予它的工作单元,那么它肯定应该使用信号对象,因为这将确保它不会不必要地使用CPU。
如果有自己的工作要做,那又是另一回事了。 我不会暂停从另一个线程的线程(如果有两个线程提交工作,会发生什么情况?) – 我的基本规则是线程应该使用来自其他线程的建议来控制自己的生命周期。 这本地化线程本身的所有控制。
在Delphi中看到关于多线程的优秀教程: 多线程教程
另一个选择是Delphi 2009中引入的TMonitor,它具有Wait,Pulse和PulseAll等功能,在没有任何工作的情况下保持线程无效,并在应该继续工作时立即通知它们。 它在Java中的对象锁之后被松散地建模。 就像那里一样,Delphi对象现在有一个可以用于线程同步的“锁”字段。
一个提供线程队列类的例子的博客可以在http://delphihaven.wordpress.com/2011/05/04/using-tmonitor-1/找到。
不幸的是,TMonitor实现中存在一个bug,这个bug在XE2中似乎已经修复了