Delphi - 线程与线程私有变量的区别

Delphi - Diff between Threadvar and thread private variable

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

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

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

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

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

更多背景知识: 当线程为 "born" 时,threadvar 变量为 "created" 启动线程实际上什至不必使用 TThread class! 启动。 (例如,您可以使用 winapi 系统调用启动一个新线程)

不久前我发现了这个问题,因为我造成了内存泄漏并且很难找出原因。 另外:您不能在声明 unitinitialization/finalization 部分初始化和完成 threadvar 。即使是内部使用的、引用计数的字符串和数组在用作 threadvar 时也会造成内存泄漏,并且在线程 "dies".

之前不会被拥有线程显式无效

据我所知,您不能在 class 中声明 threadvar。也许你可以创建一个 class threadvar ,但我从来没有 tried/needed 它。

IMO 通常 "a better way" 而不是 threadvar。 在 delphi 中使用线程的一些好的开始是提供的 delphi parallel library, or the open source OmniThread library.