Delphi-Threadvar和线程私有变量之间的差异

时间:2019-01-17 16:41:27

标签: tthread

在Delphi中,“ Threadvar”(每个线程可用的变量的私有副本)与在“线程”的“私有”部分中声明的变量之间的区别是什么:

TMyThread = class (TThread)
private
  FValue: integer
...
end;

在以后的情况下,每个线程也应该有一个单独的FValue副本。

1 个答案:

答案 0 :(得分:1)

简而言之: 您的FValue中的TMythread将原则上可以从所有线程访问,但前提是它们必须设法通过“ private”墙。因此它实际上只是一个对象字段,就像其他任何对象字段一样。

threadvar更像是全局变量,并且同样可以访问。除了每个线程都有自己的声明的threadvar实例之外。

更多背景信息: 当线程“出生”时,将“创建” threadvar变量实际上,甚至不必使用TThread类来启动启动线程! (例如,您可以使用winapi系统调用来启动新线程)

不久前,我很难找到答案,因为我造成了内存泄漏,并且很难找出原因。 另外:您不能在声明threadvar的{​​{1}} / initialization部分中初始化和完成finalization的操作。甚至内部使用的,引用计数的字符串和数组在用作threadvar时也会造成内存泄漏,并且不会在线程“死”之前被拥有的线程显式取消。

自动操作您无法在unit内声明threadvar。也许您可以创建一个class,但是我从未尝试过/不需要它。

IMO通常比使用class threadvar有“更好的方法”。 在提供的delphi parallel library或开放源代码OmniThread library中,在delphi中使用线程是一个很好的开始。