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.