Étant donné le scénario ci-dessous, la valeur de AValue dans DoSomething est-elle lue par le thread anonyme garanti "lisible"? c'est-à-dire, la valeur que j'attends? Pour moi, je ne pense pas que DoSomething soit hors de portée (ie, retourne) avant que le thread ne s'exécute réellement (ce qui peut être facilement vu en réalisant que la ligne x: = 2 s'exécute toujours avant que mon thread ne démarre - bien qu'avec les threads tous les paris sont désactivés et mon thread peut exécuter avant que DoSomething ne retourne). Je demande seulement parce que je n'ai jamais rencontré le scénario dans mes tests où AValue n'est pas égal à 1 (aka, la valeur transmise) donc je me demande si une référence implicite est tenue à la procédure et/ou thread (encore une fois peu probable car CreateAnonymousMethod crée simplement une instance d'un descendant TThread (TAnonymousThread) et appelle ma méthode anonyme "execute"). Je devine cependant que c'est la même chose car rien (dans ce scénario limité) n'a écrasé l'emplacement de la mémoire où AValue est stocké.Est-il sûr d'accéder à une variable locale dans le contexte d'un thread anonyme?
procedure TForm2.Button1Click(Sender: TObject);
var
x: Integer;
begin
x := 1;
DoSomething(x);
x := 2;// this line is only here for the purposes of placing a break point
end;
procedure TForm2.DoSomething(AValue: Integer);
begin
TThread.CreateAnonymousThread(
procedure
var
y: Integer;
begin
y := AValue;
if y = 1 then
MessageBox(0, 'Same', 'Value', MB_ICONINFORMATION or MB_OK)
else
MessageBox(0, 'Different', 'Value', MB_ICONINFORMATION or MB_OK)
end).Start;
end;
EDIT Juste pour vérifier, je voulais savoir s'il est sûr de capturer une variable locale dans le contexte d'un fil anonyme.
Oui, désolé. Je comprends complètement que x: = 2 ne sera pas reflété dans le fil anonyme. Ce que je veux savoir, c'est si (dans l'exemple ci-dessus - mais aussi dans des scénarios plus compliqués) que AValue est garanti à 1 lorsque le thread est exécuté. c'est à dire, "Thread Safe". – Jason
Réponse mise à jour. Si vous modifiez AValue plus tard dans la méthode DoSomething, vous êtes en difficulté. –
Oui. Comprendre.Donc je peux supposer que AValue sera toujours 1? c'est-à-dire que mon AnonymousThread peut accéder en toute sécurité aux variables locales? – Jason