Delphi - разница между Threadvar и приватной переменной потока - PullRequest
0 голосов
/ 17 января 2019

В Delphi, какова разница между 'Threadvar' (частная копия переменной, доступной для каждого потока) и переменной, объявленной в разделе 'приватный' потока, как:

TMyThread = class (TThread)
private
  FValue: integer
...
end;

В более позднем случае такжекаждый поток должен иметь отдельную копию FValue.

1 Ответ

0 голосов
/ 18 января 2019

Короче говоря: FValue в вашем TMythread в принципе будет доступен из всех потоков, но только если им каким-то образом удастся пройти через стену "private". Так что на самом деле это просто поле объекта, как и любое другое поле объекта.

threadvar, однако, больше похож на глобальную переменную и также доступен. За исключением того, что каждый поток получает свой собственный экземпляр объявленного threadvar.

немного больше фона: Переменная threadvar «создается», когда поток «рождается». Начальный поток фактически даже не нужно запускать с использованием класса TThread !. (например, вы можете начать новый поток, используя системный вызов winapi)

Некоторое время назад я нашел этот трудный путь, потому что создал утечку памяти, и мне было трудно понять, почему. Также: вы не можете инициализировать и завершить threadvar в разделах initialization / finalization декларируемого unit. Даже внутренние строки и массивы с подсчетом ссылок вызовут утечку памяти при использовании в качестве threadvar, и не будут явно аннулированы потоком-владельцем до того, как поток «умрет».

AFAIK, вы не можете объявить threadvar внутри class. Может быть, вы можете создать class threadvar, но я никогда не пробовал / не нуждался в этом.

ИМО, как правило, "лучший способ", чем использование threadvar. Некоторым хорошим началом для использования потоков в delphi является предоставляемая параллельная библиотека delphi или библиотека с открытым исходным кодом OmniThread .

...