Ну для начала код с threadvar
является недопустимым синтаксисом.У threadvar
должна быть область действия единицы, а не локальная область.
Локальная переменная
Каждый вызов (в том числе из разных потоков и повторные входящие вызовы)Функция приводит к различным экземплярам локальных переменных этой функции.
Локальная переменная потока
Локальная переменная потока имеет отдельные экземпляры для каждого потока в процессе.Существует взаимно-однозначное сопоставление между экземплярами переменной и потоками.
Обсуждение
Если ваша процедура не повторяется, и она является единственнойПроцедура, которая ссылается на переменную, тогда не будет семантической разницы между локальной переменной и threadvar
- но если локальная переменная может использоваться, то она должна быть.
С точки зрения производительности threadvar
он медленнее локальной переменной и может даже не работать в контексте DLL.
Я рекомендую использовать локальную переменную везде, где это возможно.Используйте threadvar
(или Локальное хранилище потоков (TLS) в DLL), если вам нужна переменная глобальной области видимости, которая имеет один экземпляр на поток.Однако такая необходимость встречается редко и имеет серьезные недостатки, заключающиеся в том, что локальные переменные потока имеют много тех же недостатков, что и истинные глобальные переменные.