1

在 Delphi 中,'Threadvar'(每个线程可用的变量的私有副本)和在 Thread'private' 部分中声明的变量之间的区别是什么,例如:

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

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

4

1 回答 1

1

简而言之:原则 上所有线程都可以访问FValue您的TMythread遗嘱,但前提是它们以某种方式设法越过了“ private”墙。所以它实际上只是一个对象字段,就像任何其他对象字段一样。

然而,threadvar它更像是一个全局变量,同样可以访问。除了每个线程都有自己的声明的实例threadvar

更多背景知识: threadvar 变量是在线程“诞生”时“创建”的。启动线程实际上甚至不必使用TThread类启动!(例如,您可以使用 winapi 系统调用启动新线程)

不久前,我发现了这个问题,因为我造成了内存泄漏并且很难找出原因。另外:您不能在声明threadvarinitialization/finalization部分初始化和完成 a unit。即使是内部使用的、引用计数的字符串和数组,在用作 threadvar 时也会造成内存泄漏,并且在线程“死亡”之前不会被拥有的线程显式取消。

AFAIK 你不能在 a 中声明threadvara class。也许您可以创建一个class threadvar,但我从未尝试过/不需要它。

IMO 通常有比使用threadvar. 在 delphi 中使用线程的一些好的开始是提供的delphi 并行库或开源OmniThread 库

于 2019-01-17T21:09:50.193 回答