Indy10线程池BUG:Idyarn线程使用Synchronize导致TerminateAllYarns挂死的解决办法
来源:互联网 发布:mac口红dareyou试色 编辑:程序博客网 时间:2024/06/11 21:53
写了个线程池程序。用TerminateAllYarns来结束线程,每次老是界面挂死在此段代码。
起初以为是代码同步或互斥问题,查了半天没找到。于是跟踪原代码进去,发现原来是这段代码导致了死循环 :
------------------IdScheduler.pas--------------
procedure TIdScheduler.TerminateAllYarns;
var
i: Integer;
begin
while True do begin
// Must unlock each time to allow yarns that are temrinating to remove themselves from the list
with FActiveYarns.LockList do try
if Count = 0 then begin
Break;
end;
for i := 0 to Count - 1 do begin
TerminateYarn(TIdYarn(Items[i]));
end;
finally FActiveYarns.UnlockList; end;
//TODO: Put terminate timeout check back
Sleep(500); // Wait a bit before looping to prevent thrashing
end;
end;
一旦idyarn调用对应线程使用了Synchronize,则必须有一段程序插到主线程去运行才能继续。结果主线程执行到此TerminateAllYarns时,就开始没完没了的置stop标志了。于是主线程就挂死在此了。
改进办法是:
在for i := 0 to Count - 1 do begin前加入Application.ProcessMessages;令主线程喘口气运行子线程的Synchronize代码,这样就不会在此没完没了的stop死循环了。
不过这样又得注意一个问题,就是一旦Application.ProcessMessages允许事件冒泡,那么可能重复触发TerminateAllYarns导致在FActiveYarns.LockList时死锁,因此设置判断避免TerminateAllYarns重复触发
- Indy10线程池BUG:Idyarn线程使用Synchronize导致TerminateAllYarns挂死的解决办法
- curl使用curl_easy_perform导致线程或者进程卡死解决办法
- Delphi Dll线程使用Synchronize同步导致线程假死的解决方法
- 线上bug导致tomcat 线程池堆积
- 在并发环境下使用HashMap导致的线程死循环问题
- 线程安全 synchronize关键字
- java--线程--锁-synchronize
- java多线程&&synchronize&&将集合线程变安全&&线程池
- 线程同步锁对象不同导致的安全问题及解决办法
- Indy10的使用例子
- Java进程与父子进程的标准输出流关联导致线程卡死的故障
- ios中常用的线程同步策略-synchronize …
- indy10获取对方IP及线程
- 线程池bug
- 使用Asynctask导致线程阻塞
- python线程池实现bug的修改
- 线程同步的解决办法
- Activitys中使用线程导致的内存泄露
- 推荐一款linux下流程图绘制工具-yEd Graph Editor
- 如何用FPGA实现算法的硬件加速
- 绕过 KIS 7 防火墙的一种简单方法
- 监控HOOK WSARecv的回调函数
- Log4J的封装
- Indy10线程池BUG:Idyarn线程使用Synchronize导致TerminateAllYarns挂死的解决办法
- 疯狂学技术
- Effective C++学习记录之Things To Remember
- 使用GSL进行数据处理
- Visual Basic的类对于面向对象的支持
- AMD电脑运行Matlab所需的环境变量设置
- Vista系统优化(1)——垃圾文件清理
- Vista系统优化(2)——系统盘终极减肥
- 复选框