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 系统调用启动一个新线程)
不久前我发现了这个问题,因为我造成了内存泄漏并且很难找出原因。
另外:您不能在声明 unit
的 initialization
/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.
在 Delphi 中,'Threadvar'(每个线程可用的变量的私有副本)和线程 'private' 部分中声明的变量之间的区别是什么:
TMyThread = class (TThread)
private
FValue: integer
...
end;
在后一种情况下,每个线程也应该有一个单独的 FValue 副本。
简而言之:
TMythread
中的 FValue
原则上可以从所有线程访问,但前提是它们以某种方式设法越过“private
”墙。所以它实际上只是一个对象字段,就像任何其他对象字段一样。
然而 threadvar
更像是一个全局变量,同样可以访问。除了每个线程都有自己声明的 threadvar
的实例。
更多背景知识:
当线程为 "born" 时,threadvar 变量为 "created" 启动线程实际上什至不必使用 TThread
class! 启动。 (例如,您可以使用 winapi 系统调用启动一个新线程)
不久前我发现了这个问题,因为我造成了内存泄漏并且很难找出原因。
另外:您不能在声明 unit
的 initialization
/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.