保持线程最佳吗?
应用程序具有辅助线程。这个线程并不是一直都在运行,但是主进程可以经常调用它。
因此,我的问题是,就CPU性能而言,哪一个最佳选择是:不使用线程时将其挂起或者保持其活动状态,并使用WaitForSingleObject函数以等待来自主进程的信号?
解决方案
我们所说的"暂停"是什么意思? WaitForSingleObject将挂起线程,即在信号到达之前它不会消耗任何CPU。
如果它是一个从外部分配了工作单元的工作线程,则绝对应该使用信号对象,因为这将确保它不会不必要地使用CPU。
如果它还有自己的工作要做,那是另一回事。我不会从另一个线程中挂起该线程(如果有两个线程向其交付工作会发生什么?),我的基本规则是,线程应根据其他线程的建议来控制自己的生命周期。这将所有控件本地化在线程本身中。
我会假设Andrei不使用Delphi编写.NET,因此Suspend不会转换为System.Threading.Thread.Suspend而是SuspendThread Win32 API。
我强烈建议反对。如果我们在任意时刻暂停线程,那么我们将不知道会发生什么(例如,我们可能以某种状态暂停线程,即某些共享资源被阻塞)。但是,如果我们已经知道线程处于可挂起状态,则只需使用WaitForSingleObject(或者任何其他WaitFor调用),它将与挂起线程同等有效,即线程在唤醒前将使用零CPU时间。
就使用的CPU资源而言,两个解决方案都与被挂起的线程和在WaitForSingleObject中等待一个未发出信号的对象的线程相同,而这两个解决方案完全没有CPU周期。
就是说,WaitForSingleObject几乎始终是首选的解决方案,因为使用它的代码将更"自然",更易于阅读,更容易实现正确。挂起/恢复线程可能很危险,因为我们需要格外小心,以确保我们知道处于正在暂停线程不会造成任何危害的状态下暂停线程(想象一下,暂停当前持有互斥锁的线程)。
请参阅有关Delphi中多线程的出色教程:
多线程教程