昨天专家建议在线程执行函数中使用"while not terminated do begin ..."来检查线程终止属性并从内部优雅地退出线程.我们刚刚测试了代码,但它仍然无法终止线程.但是这个线程可以通过外部调用TerminateThread函数实际终止.执行函数或执行函数中的大循环中有一些缺陷吗?或者在使用非终止循环时是否有特殊要求?
顺便说一句,endthread,exitthread和terminatethread之间有什么区别?怎么用?哪个比较好?
再次感谢你的帮助.
如果while not Terminated do不终止线程很快就好了,然后在每个迭代的工作量太大(也就是循环条件not Terminated检查太少),或者你有"不小心"把大量的代码后,这个循环.
当然,如果你有一个反复运行循环的线程,直到终止,那么你应该这样做while not Terminated do.典型地,一个迭代在短时间内完成(在每秒1〜10000次迭代的订单?),所以循环条件经常检查(之间每秒1〜10000倍).但是,如果你的线程不在于这样一个循环,然后,当然,把整个Execute身体里面while not Terminated do不会帮你.
好
procedure TMyThread.Execute;
begin
inherited;
while not Terminated do
ComputeTheNextTenDigitsOfPi; // Takes 100 ms.
end;
Run Code Online (Sandbox Code Playgroud)
坏
procedure TMyThread.Execute;
begin
inherited;
while not Terminated do
ComputeAVeryVeryLargeFractal; // Takes an hour.
// And you will create the same fractal
// over and over again.
end;
Run Code Online (Sandbox Code Playgroud)
如果您必须终止作业 - 例如,因为它在您无法控制的代码中被阻止 - 那么考虑尝试将其完全包装在一个单独的可执行文件中,并将其作为子进程运行,并在您执行时终止该进程需要它停止.进程具有比线程更强的隔离.终止一个线程是一个肯定的痛苦方法 - 如果被终止的线程在内存管理器或某个类似的地方持有锁定怎么办?下次尝试分配内存(或类似内存)时,您的应用程序将陷入僵局!
CodeInChaos 在评论中提供了一些很好的建议 - 在极少数情况下,线程应该从外部终止.
某些线程环境具有取消功能,您可以在其中取消(而不是终止)一个线程,当它准备就绪时,它将自行终止.这允许线程为何时安全终止设置自己的规则.
外部查杀的问题是目标线程可能具有资源锁定,现在永远不会被释放,从而导致潜在的死锁.或者,即使在线程退出时释放资源,该资源中的数据也可能不再一致.
遵循的基本规则是所有线程必须检查它们是否应该及时终止.换句话说,如果您正在等待工作,请在循环中经过几秒钟后超时并检查状态:
do while not terminating:
wait 2 seconds for work
if not terminating and work available:
do it
Run Code Online (Sandbox Code Playgroud)
一旦terminating设置了标志,该特定线程将永远不会超过大约两秒钟退出.
而且,如果do it是一个长期运行的任务,您可能还想定期检查,如果您也应该退出.
| 归档时间: |
|
| 查看次数: |
2667 次 |
| 最近记录: |