Вопрос по Delphi threadvar

Когда объявлен threadvar, когда эта переменная будет инициализирована (объект создан)? Это происходит при первом присвоении var? Например:

threadvar
  myThreadVar : string;

......

//inside a thread
  ...
  myThreadVar := 'my value'; // In this point the var will be initialized?

Что произойдет, если я попытаюсь использовать этот var вне потока после того, как поток установил значение для var? Например:

//at the main thread (application)
  ...
  //Call the thread;
  //thread finishes execution
  //thread is destroyed
  ShowMessage(myThreadVar); // what happens here?

Ответ 1

Threadvars для потока инициализируются, когда их поток обращается к любому из них. Они имеют значение по умолчанию для всех бит-ноль, которое для строк является пустой строкой.

Threadvars может быть завершена или не может быть завершена. Это зависит от того, насколько RTL получает уведомление о завершении потока. По этой причине, вероятно, лучше не хранить динамически распределенные типы (включенные строки) в threadvars. Вместо этого используйте переменную экземпляра объекта TThread для хранения данных, относящихся к потоку.


Вторая часть вашего вопроса - глупость. Он выполняет выполнение кода в потоке после того, как поток уже завершен. Нет такой вещи, как запуск кода "вне потока". Весь код работает в потоках. Каждая программа имеет хотя бы один поток.

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

Ваш вызов ShowMessage отобразит значение, принадлежащее текущему потоку, а не конец, который уже завершен.

Ответ 2

Локальное хранилище нити будет обнулено (инициализировано) при создании потока. Поэтому перед тем, как вы запустите строку myThreadVar := 'my value';, это будет пустая строка.

Что касается вашего второго вопроса, то нитки являются уникальными для каждого потока. Когда вы объявляете threadvar, вы объявляете слот в локальном хранилище потоков, и каждый поток получает копию слота. Вы можете думать о нем как о стиле thread1.myThreadVar, thread2.myThreadVar, mainThread.myThreadVar и т.д. Поэтому, если вы установите threadvar в одном потоке и попытаетесь прочитать его в другом, вы не будете читать то, что вы установили в другая нить; вы будете читать все, что назначено текущей версии потока threadvar.

Ответ 3

threadvar означает, что у вас есть экземпляр переменной для потока. Там нет такой вещи, как "вне потока" - если вы не работаете в явном потоке, который вы создали, вы используете поток потока по умолчанию. если вы установите threadvar на значение в явном потоке, это значение невидимо для всех других потоков.