threadvar和局部变量之间有什么区别

时间:2011-03-03 12:51:53

标签: multithreading delphi thread-safety local-variables

在我的主题中,我总是“正常”声明局部变量,因此:

procedure TMyThread.Execute ;

var
   i : integer ;

begin
i := 2 ;

等,如果我这样声明:

procedure TMyThread.Execute ;

threadvar
   j : integer ;

begin
j := 2 ;

执行/代码生成/速度/线程安全如何改变?

2 个答案:

答案 0 :(得分:18)

首先,使用threadvar的代码语法无效。 threadvar需要具有单位范围而不是本地范围。

本地变量

函数的每次调用(包括来自不同线程和重入调用)都会导致该函数的局部变量的不同实例。

线程局部变量

线程局部变量具有进程中每个线程的单独实例。变量和线程的实例之间存在一对一的映射。

<强>讨论

如果你的程序不是可重入的,并且它是引用变量的唯一过程,那么局部变量和threadvar之间将没有语义差异 - 但是如果可以使用局部变量它应该是。

就性能而言,threadvar比局部变量慢,甚至可能无法在DLL的上下文中工作。

我建议在任何可能的地方使用局部变量。如果需要一个全局范围变量,每个线程都有一个实例,请使用threadvar(或在DLL中为Thread Local Storage (TLS))。然而,这种需求很少,并且具有严重的缺点,即线程局部变量与真正的全局变量具有许多相同的缺点。

答案 1 :(得分:2)

通过使用ThreadVar关键字,每个线程都被赋予每个变量的单独实例,从而避免数据冲突,并保持线程独立性。

此外,您不需要在关键部分保护您的threadvar变量,因为这是线程本地的事实。

最好的问候,
拉杜