В чем разница между threadvar и локальной переменной - PullRequest
9 голосов
/ 03 марта 2011

В своих потоках я всегда объявляю локальные переменные "нормально", например:

procedure TMyThread.Execute ;

var
   i : integer ;

begin
i := 2 ;

и т. Д. Если я объявляю их таким образом:

procedure TMyThread.Execute ;

threadvar
   j : integer ;

begin
j := 2 ;

как выполняется выполнение / генерация кода/ скорость / потокобезопасность изменить?

Ответы [ 2 ]

18 голосов
/ 03 марта 2011

Ну для начала код с threadvar является недопустимым синтаксисом.У threadvar должна быть область действия единицы, а не локальная область.

Локальная переменная

Каждый вызов (в том числе из разных потоков и повторные входящие вызовы)Функция приводит к различным экземплярам локальных переменных этой функции.

Локальная переменная потока

Локальная переменная потока имеет отдельные экземпляры для каждого потока в процессе.Существует взаимно-однозначное сопоставление между экземплярами переменной и потоками.

Обсуждение

Если ваша процедура не повторяется, и она является единственнойПроцедура, которая ссылается на переменную, тогда не будет семантической разницы между локальной переменной и threadvar - но если локальная переменная может использоваться, то она должна быть.

С точки зрения производительности threadvarон медленнее локальной переменной и может даже не работать в контексте DLL.

Я рекомендую использовать локальную переменную везде, где это возможно.Используйте threadvar (или Локальное хранилище потоков (TLS) в DLL), если вам нужна переменная глобальной области видимости, которая имеет один экземпляр на поток.Однако такая необходимость встречается редко и имеет серьезные недостатки, заключающиеся в том, что локальные переменные потока имеют много тех же недостатков, что и истинные глобальные переменные.

2 голосов
/ 03 марта 2011

Используя ключевое слово ThreadVar, каждому потоку присваивается отдельный экземпляр каждой переменной, что позволяет избежать конфликтов данных и сохранить независимость потока.

Также вам не нужно защищать переменные вашего потока в критических разделах из-за того, что они локальны для потока.

С наилучшими пожеланиями,
Radu

...