Delphi 类变量是不是具有全局或线程本地存储?

Posted

技术标签:

【中文标题】Delphi 类变量是不是具有全局或线程本地存储?【英文标题】:Do Delphi class vars have global or thread local storage?Delphi 类变量是否具有全局或线程本地存储? 【发布时间】:2010-09-10 01:46:24 【问题描述】:

我的猜测是类变量(“class var”)在存储中是真正的全局变量(即整个应用程序的一个实例)。

但我想知道是否是这种情况,或者它们是否是存储中的线程(例如,类似于“threadvar”) - 每个线程一次实例。

有人知道吗?

编辑:将“范围”更改为“存储”,因为这实际上是正确的术语,也是我所追求的(感谢 Barry)

【问题讨论】:

【参考方案1】:

类变量根据其成员可见性属性进行作用域,并且具有全局存储,而不是线程存储。

范围是一个句法概念,与从何处可见的标识符有关。这里关心的是变量的存储。

【讨论】:

【参考方案2】:

是的,类变量是全局范围的。查看 RTL 源代码,了解如何实现 threadvars 的详细信息。在 Win32 下,每个线程可以在创建线程时自动分配一块内存。这个额外的数据区域用于包含您的线程变量。

【讨论】:

我毫不怀疑你是对的。想知道系统应该如何工作......这是一个需要权威“是/否”答案的问题,我想知道在“接受”答案之前我应该​​考虑多少票是“权威”的。怎么办,怎么办……? 丹尼尔的回答是正确的,我投了赞成票。我想知道您是否可以通过将类 var 引用到线程 var 来使用一些技巧?没有尝试过 - 也不会尝试:) @Lars - 我怀疑将 standard 类字段而不是“class var”引用到 threadvar 就足够了。如果对象/变量的生命周期在引用对象的实例之外,并且需要一个 threadvar,则该生命周期已经提供,因此无需进一步的诡计。 ^ 顺便说一句,我也想知道同样的事情,但出于兴趣。事实上,这个问题也是出于兴趣考虑(我不需要立即获取此信息),并且是由另一个关于类变量的问题引发的。 我已经接受了这个答案,看来我们都同意/知道它是正确的。但是,为了将来可能偶然发现它的任何人,在这里获得外部参考会很好..【参考方案3】:

类变量就像类一样:对应用程序来说是全局且唯一的。

【讨论】:

以上是关于Delphi 类变量是不是具有全局或线程本地存储?的主要内容,如果未能解决你的问题,请参考以下文章

线程本地存储及实现原理

delphi中用线程类怎么知道是哪个线程结束了调用onterminate的事件函数?

.Net - 线程本地变量(存储)的使用

Delphi多线程访问公共变量,可以吗

使用具有共享全局变量的线程

线程本地存储(Thread Local Storage)