Istnieje wiele niejasności w. odpowiedzi tutaj, w większości oparte na nieprawdzie, że zmienne lokalne są przydzielane "na stosie wątku" .To jest bo fałszywy i nieistotny.
Jest to wartość false, ponieważ zmienna lokalna może być przydzielona do pewnej puli tymczasowej lub do puli długoterminowej; nawet jeśli jest przydzielony do puli tymczasowej, nie musi to być pamięć stosu; może to być rejestr. Nie ma to znaczenia, ponieważ kogo obchodzi, na jaką pulę jest przeznaczona pamięć?
Istotny jest fakt, że jest przypisywana lokalna zmienna najwyższego poziomu dla każdej aktywacji metody. Bardziej ogólnie, zmienna lokalna w bloku jest przydzielana raz na wpisywany blok; Zmienna lokalna zadeklarowana w ciele pętli jest na przykład przydzielana za każdym razem, gdy pętla się kręci.
Zatem rozważmy zapytanie:
Metoda ta może być wywołana z wielu wątków jednocześnie.Jeśli jeden wątek utknął w DoStuffThatMightTakeAWhile, a drugi wątek wywoła DoSomething z innym arg, czy zmieni to wartość someVar dla wszystkich wątków?
nr Jest nowy "somevar" dla aktywacji każdego z doSomething.
Czy dla każdego wątku będzie istniała jakaś wartość?
One "somevar" będzie istnieć dla każdego aktywacji. Jeśli wątek wykonuje dokładnie jedną aktywację, wtedy będzie dokładnie jeden jedenVar na wątek; jeśli wątek wykonuje milion aktywacji, będzie ich milion.
Powiedział, że odpowiedź Jon Hanna jest również prawidłowa: jeśli popełnisz delegata, który zarówno odczytuje i zapisuje do zmiennej lokalnej, a ręka że delegata się wiele wątków, a następnie wszystkie aktywacje udziału delegat ta sama zmienna lokalna. Nie stworzono dla ciebie magicznego bezpieczeństwa nici; jeśli chcesz to zrobić, jesteś odpowiedzialny za zapewnienie bezpieczeństwa wątku.
Tak więc w kilku słowach deklaracja typu 'string myVar;' będzie __create__ nowa 'myVar', podobnie jak ja stworzyłem obiekt ze słowem kluczowym' new'? Czy dotyczy to również wywołań rekursywnych (jeśli 'DoSomething' nazwałoby' DoSomething')? – Juan
@jsoldi: Sposób, w jaki alokator pamięci tworzy nowych lokali i sposób, w jaki tworzy nowe obiekty pamięci, może być bardzo różny za kulisami, ale koncepcyjnie są one tym samym. I tak, rekursywne połączenia są * aktywacjami * tak jak połączenia nierekurencyjne. Każda * aktywacja * dostaje nową partię mieszkańców. –
Dlaczego nazywasz to "aktywacją metody", a nie "wywołaniem metody". Czy to jest specjalne określenie? – Restuta