在 Delphi 中,'Threadvar'(每个线程可用的变量的私有副本)和在 Thread'private' 部分中声明的变量之间的区别是什么,例如:
TMyThread = class (TThread)
private
FValue: integer
...
end;
在后一种情况下,每个线程都应该有一个单独的 FValue 副本。
在 Delphi 中,'Threadvar'(每个线程可用的变量的私有副本)和在 Thread'private' 部分中声明的变量之间的区别是什么,例如:
TMyThread = class (TThread)
private
FValue: integer
...
end;
在后一种情况下,每个线程都应该有一个单独的 FValue 副本。
简而言之:原则
上所有线程都可以访问FValue
您的TMythread
遗嘱,但前提是它们以某种方式设法越过了“ private
”墙。所以它实际上只是一个对象字段,就像任何其他对象字段一样。
然而,threadvar
它更像是一个全局变量,同样可以访问。除了每个线程都有自己的声明的实例threadvar
。
更多背景知识:
threadvar 变量是在线程“诞生”时“创建”的。启动线程实际上甚至不必使用TThread
类启动!(例如,您可以使用 winapi 系统调用启动新线程)
不久前,我发现了这个问题,因为我造成了内存泄漏并且很难找出原因。另外:您不能在声明threadvar
的initialization
/finalization
部分初始化和完成 a unit
。即使是内部使用的、引用计数的字符串和数组,在用作 threadvar 时也会造成内存泄漏,并且在线程“死亡”之前不会被拥有的线程显式取消。
AFAIK 你不能在 a 中声明threadvar
a class
。也许您可以创建一个class threadvar
,但我从未尝试过/不需要它。
IMO 通常有比使用threadvar
. 在 delphi 中使用线程的一些好的开始是提供的delphi 并行库或开源OmniThread 库。