在我的线程中,我总是以“正常”的方式声明局部变量,例如:
procedure TMyThread.Execute ;
var
i : integer ;
begin
i := 2 ;
等等,如果我这样声明它们:
procedure TMyThread.Execute ;
threadvar
j : integer ;
begin
j := 2 ;
执行/代码生成/速度/线程安全性如何改变?
(注:已经保留了HTML标签,无需再次添加)
在我的线程中,我总是以“正常”的方式声明局部变量,例如:
procedure TMyThread.Execute ;
var
i : integer ;
begin
i := 2 ;
等等,如果我这样声明它们:
procedure TMyThread.Execute ;
threadvar
j : integer ;
begin
j := 2 ;
执行/代码生成/速度/线程安全性如何改变?
首先,带有 threadvar
代码是无效的语法。一个 threadvar
需要具有单元作用域而不是本地作用域。
局部变量
每次调用函数(包括来自不同线程和可重入调用)都会导致该函数的局部变量的不同实例。
线程本地变量
线程本地变量对于进程中的每个线程都有单独的实例。变量的实例和线程之间存在一对一的映射关系。
讨论
如果您的过程不是可重入的,并且它是唯一引用变量的过程,则本地变量和 threadvar
之间没有语义差异 - 但是如果可以使用本地变量,则应该使用本地变量。
在性能方面,threadvar
比本地变量慢,甚至在 DLL 的上下文环境中可能无法工作。
我的建议是尽可能在可能的情况下使用本地变量。如果需要一个每个线程只有一个实例的全局范围变量,则使用 threadvar
(或者在 DLL 中使用Thread Local Storage (TLS))。然而,这种需求很少见,并且线程本地变量有许多与真正的全局变量相同的缺点。