delphi多线程加锁

本文介绍了由于未正确设置IsMultiThread标志导致的Delphi多线程内存管理错误,分析了错误产生的原因、表现及避免方法。建议在使用API.CreateThread创建线程时设置IsMultiThread为True,或改用System.BeginThread,同时推荐在开发环境中配置多套内存管理器以备不时之需。
摘要由CSDN通过智能技术生成

   前几日,调试一BUG,过程先不说,最后调试到MM,即Debug dcu,然后进入到GetMem.inc中的Get/FreeMem函数处后,出现AV。

   然后一通找。。。郁闷了N天,后来发现将MM切换到QMM后,一切正常,然后再切回原MM,BUG出现。。。

   按经验,此类问题一般由于线程未有锁保护引起,但就是没找到原因所在。

   好吧,也不怎么滴,突然想起IsMultiThread变量,想起MM的Get/Free/Realloc都需要这个玩意进行保护,而VCL中,只有一个地方对这变量进行操作: Classes.TThread.Create->System.BeginThread

   然后才想起自己未使用TThread,使用API.CreateThread进行创建线程,而它未对IsMultiThread进行置true操作,问题找到,BUG解除。

 

遂,本文记录此问题。

 

BUG形成:

   1:程序未使用TThread或BeginThread进行创建线程,这样,它就不会对IsMultiThread进行操作

   2:自行使用API.Windows.CreateThread创建线程,且未对IsMultiThread置true

   3:在创建的线程中,进行Get/Free/ReallocMem,并与其它线程(如主线程)进行交互该内存块

 

BUG展现&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值