Delphi系统变量:IsMultiThread对MM的影响
前几日,调试一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进行操作。
注意:TThread和BeginThread对IsMultiThread置True后,没有其它VCL代码进行置false操作(不建议自己置false)
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问题引起。
注:
MM=Memory Manager, D2005版本开始集成FastMM。
不过,从D7(D5没注意看,应该也是)的GetMem.Inc,一直到FastMM4.991都依赖于IsMultiThread标志进行线程保护,未进行自维护该标志。
所以,当出现此BUG条件形成时,就会出现:我知道因为多线程未保护引起数据错乱而引起的BUG,但就是找不着在哪里触发的,怎么去解决。这才是最坑爹的。 :)
完。
2014.10.15 by qsl
Delphi系统变量:IsMultiThread对MM的影响的更多相关文章
- 系统变量file.encoding对Java的运行影响有多大?(转)good
这个话题来自: Nutz的issue 361 在考虑这个issue时, 我一直倾向于使用系统变量file.encoding来改变JVM的默认编码. 今天,我想到, 这个系统变量,对JVM的影响到底有多 ...
- Sql server函数的学习1(系统变量、错误函数、转换函数)
一.系统变量的介绍和使用 1.@@ERROR 变量 2.@@SERVICENAME 变量 3.@@TOTAL_ERRORS 变量 4.@@TOTAL_READ 变量 5.@@VERSION 变量 二. ...
- AutoCAD系统变量一览表
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...
- CAD系统变量(参数)大全
所谓系统变量就是一些参数,这些参数有些是可以在“选项”或其他对话框中进行设置的,有些这必须通过在命令行输入变量名进行设置,当然对于高手来说,还可以通过二次开发程序来进行控制. CAD有很多的变量,例如 ...
- mysql show variables系统变量详解
mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...
- [Form Builder]Oracle Form系统变量中文版总结大全
转:http://yedward.net/?id=57 Form中的系统变量,它存在于一个Form的整个运行时期的会话之中,变量包含了有关Form相关属性的字节信息.有些变量标明了当前状态,还有些变量 ...
- Thinkphp入门 四 —布局、缓存、系统变量 (48)
原文:Thinkphp入门 四 -布局.缓存.系统变量 (48) [控制器操作方法参数设置] http://网址/index.php/控制器/操作方法 [页面跳转] [变量调节器] Smarty变量调 ...
- MySQL用户和系统变量
--MySQL用户和系统变量 -----------------------------2014/05/19 用户变量 可以先在用户变量中保存值然后在以后引用它:这样可以将值从一个语句传递到另一个语句 ...
- SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器
SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器 1. T-SQL编程 (1)声明变量 declare @age int (2)为变量赋值 (3)while循环 ...
随机推荐
- Adobe After Effects工程使用aep格式来存储
写页面的时候发现好几处的按钮都是这种样式,于是把这个按钮的样式单独提取出来放着全局css文件中 .base-btn { display: block; width: 90%; height: 54px ...
- 初学JAVA 感想
开始学习任何一门课(包括java),兴趣最重要.一直觉得自己在学计算机编程语言,学习了很多,但每门语言都停留在知识边缘地带,都没深入到它们的精华部分,对它们的精华部分知之甚少,于是趁学校开设这门课,并 ...
- IOS 网络请求
技术交流新QQ群:414971585 关于网络请求的重要性我想不用多说了吧.对于移动客户端来说,网络的重要性不言而喻.常见的网络请求有同步GET, 同步POST, 异步GET, 异步POST.今天来看 ...
- 《C专家编程》第四章——令人震惊的事实:数组和指针并不相同
数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明 ...
- kuangbin_SegTree D (POJ 2528)
讲道理我之前暂时跳过染色的题是因为总觉得有什么很高端的算法来query 直到我做了F题(ZOJ 1610)才发现就是个暴力统计.....也对 也就几万个长度单位而已.... F就不po上来了 选了有点 ...
- eclipse android sdk content loader一直显示0%的问题解决
今天上班启动eclipse,发现eclipse 一直卡在android sdk content loader的地方,一直显示为0%.百度后发现很多都是一下解决方法: 关闭Eclipse,删掉Ecli ...
- 让CPU的占有率曲线听我指挥
最近我要在公司的一个study group负责AWS的AutoScaling功能的介绍.AWS可以根据instance(虚拟机)的CPU使用量进行scaling. 为了做demo,于是就有这样一个需求 ...
- mac快捷键
切换 1. 应用程序切换 command tab 2.应用程序中的窗口间切换 command ~ ===================== 通用 1. 隐藏窗口 command H 2. 最小化窗口 ...
- c#操作access,update语句不执行的解决办法
update access数据库时,使用了参数化的方式,结果不报错,但是数据也没有更新.后来发现access使用参数化时,参数位置必须和赋值顺序相同才行,否则更新时就会出现数据无法更新但是也不报错的怪 ...
- 学习笔记之vector向量容器
今天复习到vector向量容器,里面包括vector向量容器的一些优点以及具体的使用方法及代码,分享给大家. Vector向量容器不但能够像数组一样对元素进行随机访问,还可以在尾部插入元素,是一种简单 ...