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进行操作

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问题引起。

完。

2014.10.15 by qsl

时间: 2024-11-05 04:52:09

Delphi系统变量:IsMultiThread对MM的影响的相关文章

系统变量file.encoding对Java的运行影响有多大?(转)good

这个话题来自: Nutz的issue 361 在考虑这个issue时, 我一直倾向于使用系统变量file.encoding来改变JVM的默认编码. 今天,我想到, 这个系统变量,对JVM的影响到底有多大呢? 我使用最简单的方法看看这个变量的影响--在JDK 1.6.0_20的src.zip文件中,查找包含file.encoding字眼的文件. 共找到4个, 分别是: 先上重头戏 java.nio.Charset类: public static Charset defaultCharset() {

环境变量中的用户变量与系统变量的区别

在windows中,设置环境变量的时候,会看到有用户变量跟系统变量2种 那么究竟有什么区别呢? 用户变量:只针对当前用户有效 系统变量:针对整个操作系统有效 为了保证自己的修改不对别人造成影响,那么一般就是用用户变量 对于当前用户而言,设置用户变量跟系统变量大致相同,只是系统变量的路径排在用户变量之前.可能出现一种情况:如果path系统变量中包含java命令,path用户变量中也包含java命令,那么优先执行系统变量中的java命令.

Thinkphp入门 四 —布局、缓存、系统变量 (48)

原文:Thinkphp入门 四 -布局.缓存.系统变量 (48) [控制器操作方法参数设置] http://网址/index.php/控制器/操作方法 [页面跳转] [变量调节器] Smarty变量调节器 TP变量调节器:普通的php函数 (count  strlen   str_replace) 定义:前者的输出,是后者的输入 [子模板包含] 当前模块彼此包含 <include  file=”模板名称”  /> [使用布局layout] 1. 开启布局,配置变量信息config.php 2.

MySQL 系统变量(system variables)

MySQL系统变量(system variables)实际上是一些系统参数,用于初始化或设定数据库对系统资源的占用,文件存放位置等等.这些个系统变量可以分为全局以及会话级别层面来修改,有些也可以进行动态修改.本文主要介绍了系统变量的一些概念以及如何设置查看这些系统变量. 1.什么是系统变量   系统变量实际上用于控制数据库的一些行为和方式的参数.比如我们启动数据库的时候设定多大的内存,使用什么样的隔离级别,日志文件的大小,存放位置等等一系列的东东.当然我们数据库系统启动后,有些系统变量(参数)也

MySQL用户和系统变量

--MySQL用户和系统变量-----------------------------2014/05/19用户变量可以先在用户变量中保存值然后在以后引用它:这样可以将值从一个语句传递到另一个语句.用户变量与连接有关.也就是说,一个客户端定义的变量不能被其它客户端看到或使用.当客户端退出时,该客户端连接的所有变量将自动释放.用户变量的形式为@var_name,其中变量名var_name可以由当前字符集的文字数字字符.'.'.'_'和'$'组成. 默认字符集是cp1252 (Latin1).可以用m

mysql show variables系统变量详解

mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选项来更改这些默认值.服务器启动后,通过连接服务器并执行SET GLOBAL var_name语句可以更改动态全局变量.要想更改全局变量,必须具有SUPER权限. 服务器还为每个客户端连接维护会话变量.连接时使用相应全局变量的当前值对客户端会话变量进行初始化.客户可以通过SET SESSION var

MySQL系统变量

在数据库中,变量分为系统变量(以'@@'开头)以及用户自定义变量.系统变量分为全局系统变量以及会话系统变量,静态变量属于特殊的全局系统变量. 全局系统变量(global)和会话系统变量(session),有时也把全局系统变量称为全局变量,把会话系统变称为local变量或者系统会话变量.Mysql服务成功启动后,如果没有mysql客户机连接mysql服务器,那么mysql服务器内存中的系统变量全部是全局系统变量. 每个mysql客户机成功连接mysql服务器后,都会产生与之对应的会话.会话期间,没

AutoCAD系统变量一览表

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 10.0pt; line-height: 15.6pt; font-size: 10.5pt; font-family: "Times New Roman", "serif" } h1 { margin-top: 17.0pt; margin-r

MySQL之系统变量

系统变量分为全局变量和会话变量.全局变量,会影响到整个服务器.而会话变量,只会影响到当前的会话(即当前的数据库连接) 1 输出全局变量: mysql> show global variables; 查看某个全局变量: mysql> show global variables like "version"; +---------------+--------+ | Variable_name | Value  | +---------------+--------+ | ve