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

ros*_*mcm 9 delphi multithreading local-variables thread-safety

在我的线程中,我总是"正常"声明局部变量,因此:

procedure TMyThread.Execute ;

var
   i : integer ;

begin
i := 2 ;
Run Code Online (Sandbox Code Playgroud)

等等,如果我这样声明:

procedure TMyThread.Execute ;

threadvar
   j : integer ;

begin
j := 2 ;
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 18

好吧,开始使用threadvar无效语法的代码.A threadvar需要具有单位范围而不是本地范围.

局部变量

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

线程局部变量

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

讨论

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

在性能方面,threadvar它比局部变量慢,甚至可能不在DLL的上下文中工作.

我的建议是在可能的地方使用局部变量.如果您需要一个全局范围的变量,每个线程都有一个实例,请在threadvar(在DLL中时)使用(或线程本地存储(TLS)).然而,这种需求是罕见的,并且具有严重的缺点,即线程局部变量具有许多与真实全局变量相同的缺点.

  • @ross如果您不需要,请不要使用它们.堆栈分配的局部变量是圣杯.如果你可以使用堆栈变量完成所有工作,那么你就是金色! (2认同)
  • 直到刚才我才注意到,但我可以看到*thread局部变量*这个术语如何被解释为引用特殊类型的局部变量.我用连字符 - *线程局部变量* - 来强调*thread-local*正在修改*变量*,而不是简单地*thread*修改*局部变量*. (2认同)