What is the difference between a threadvar and a local variable

后端 未结 2 1995
南笙
南笙 2021-02-06 03:35

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

procedure TMyThread.Execute ;

var
   i : integer ;

begin
i := 2 ;

etc, I

2条回答
  •  半阙折子戏
    2021-02-06 03:42

    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.

提交回复
热议问题