在我的线程中,我总是“通常”声明局部变量,因此:
procedure TMyThread.Execute ;
var
i : integer ;
begin
i := 2 ;
等等,如果我这样声明它们:
procedure TMyThread.Execute ;
threadvar
j : integer ;
begin
j := 2 ;
执行/代码生成/速度/线程安全如何改变?
在我的线程中,我总是“通常”声明局部变量,因此:
procedure TMyThread.Execute ;
var
i : integer ;
begin
i := 2 ;
等等,如果我这样声明它们:
procedure TMyThread.Execute ;
threadvar
j : integer ;
begin
j := 2 ;
执行/代码生成/速度/线程安全如何改变?
threadvar
首先,语法无效的代码。Athreadvar
需要有单位范围而不是本地范围。
局部变量
函数的每次调用(包括来自不同线程和重入调用)都会导致该函数局部变量的不同实例。
线程局部变量
线程局部变量对进程中的每个线程都有单独的实例。变量的实例和线程之间存在一对一的映射。
讨论
如果您的过程不是可重入的,并且它是唯一引用该变量的过程,那么局部变量和 a 之间将没有语义差异threadvar
- 但如果可以使用局部变量,那么它应该是。
就性能而言,threadvar
它比局部变量慢,甚至可能无法在 DLL 的上下文中工作。
我的建议是尽可能使用局部变量。如果您需要一个全局范围的变量,每个线程有一个实例,请使用threadvar
(或DLL 中的线程本地存储 (TLS)) 。但是,这种需求很少见,并且具有严重的缺点,即线程局部变量与真正的全局变量具有许多相同的缺点。
通过使用 ThreadVar 关键字,每个线程被赋予每个变量的单独实例,从而避免数据冲突,并保持线程独立性。
此外,由于线程是本地的,因此您不需要在关键部分保护您的 threadvar 变量。
最好的问候,
拉杜