threadvar 和局部变量有什么区别

发布于 2024-10-20 06:18:59 字数 276 浏览 0 评论 0原文

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

procedure TMyThread.Execute ;

var
   i : integer ;

begin
i := 2 ;

等等,如果我这样声明它们:

procedure TMyThread.Execute ;

threadvar
   j : integer ;

begin
j := 2 ;

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

In my threads, I always declare local variables "normally", thus:

procedure TMyThread.Execute ;

var
   i : integer ;

begin
i := 2 ;

etc, If I declare them thus:

procedure TMyThread.Execute ;

threadvar
   j : integer ;

begin
j := 2 ;

how does execution/code generation/speed/thread-safety alter?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一身仙ぐ女味 2024-10-27 06:18:59

首先,带有 threadvar 的代码是无效语法。 threadvar 需要具有单元作用域而不是局部作用域。

局部变量

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

线程局部变量

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

讨论

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

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

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

Well for a start the code with the threadvar is invalid syntax. A threadvar needs to have unit scope rather than local scope.

Local variable

Each invocation (including from different threads, and re-entrant calls) of a function results in different instances of that function's local variables.

Thread local variable

A thread local variable has separate instances for each thread in the process. There is a one-to-one mapping between instances of the variable and threads.

Discussion

If your procedure is not re-entrant, and it is the only procedure that refers to the variable then there will be no semantic difference between a local variable and a threadvar – but if a local variable can be used then it should be.

In terms of performance the threadvar is slower than a local variable and may not even work in the context of a DLL.

My recommendation is to use a local variable wherever it is possible to do so. Use a threadvar (or Thread Local Storage (TLS) when in a DLL) if you need a variable of global scope that has a single instance per thread. However, such need is rare and has the severe downside that thread local variables have many of the same drawbacks as true global variables.

总攻大人 2024-10-27 06:18:59

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

此外,您不需要保护关键部分中的 threadvar 变量,因为它们是线程本地的。

最好的问候,
拉杜

By using ThreadVar keyword, each thread is given a separate instance of each variable, thereby avoiding data conflicts, and preserving thread independence.

Also you do not need to protect your threadvar variables in critical sections, due to the fact that are local to the thread.

best regards,

Radu

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文