首页 / DELPHI / delphi多线程加锁
delphi多线程加锁
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了delphi多线程加锁,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1291字,纯文字阅读大概需要2分钟。
内容图文

前几日,调试一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展现:
1:该BUG将会引起MM数据结构错误,问题就大了去。
出现AV时,watch查看的数据是错误的,且随机的给你不一样的数据
call stack也傻了,定位到无边际的代码。。。
总之,一切都傻掉了,不可信了。
BUG避免:
1:慎用API.Windows.CreateThread,如果要对它操作,请记得IsMultiThread := True;
如果不记得,请参照代码: System.BeginThread
或者直接使用System.BeginThread进行创建线程。
2:使用QMM,QMM是自动维护IsMultiThread,有线程数N(N>1)时, IsMultiThread=true, N=1时, IsMultiThread = false;
这点,其它MM,俺所查看的,都未做处理。(偶在打广告哩)
个人建议是:开发环境必备两套以上MM,以作备用,遇到一些莫名问题,切换一下,用以确认是否MM问题引起。
注:
线程加锁:在end.上面加上
initialization
IsMultiThread := True;
MM=Memory Manager, D2005版本开始集成FastMM。
不过,从D7(D5没注意看,应该也是)的GetMem.Inc,一直到FastMM4.991都依赖于IsMultiThread标志进行线程保护,未进行自维护该标志。
所以,当出现此BUG条件形成时,就会出现:我知道因为多线程未保护引起数据错乱而引起的BUG,但就是找不着在哪里触发的,怎么去解决。这才是最坑爹的。 :)
原文:http://www.cnblogs.com/pboy/p/5326606.html
内容总结
以上是互联网集市为您收集整理的delphi多线程加锁全部内容,希望文章能够帮你解决delphi多线程加锁所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。