Takie zachowanie jest całkowicie uzasadnione, zobaczmy, co się dzieje.
pętla szeregowa
W każdej iteracji dostajesz jedną A
, który jest tworzony na stercie, a jeden jest uzyskiwanie zniszczone. Operacje te są uporządkowane w taki sposób:
- budowa
- zniszczenie
- budowa
- zniszczenie
- ... (i tak dalej)
Od A
s tworzone są na stercie przechodzą przez alokator pamięci. Kiedy alokator pamięci otrzyma żądanie nowej pamięci, jak w kroku 3, najpierw (w wielu przypadkach) obejrzy ostatnio zwolnioną pamięć. Widzi, że ostatnia operacja była pamięcią wolną od dokładnie odpowiedniego rozmiaru (krok 2), a zatem ponownie zabierze tę porcję pamięci. Ta procedura będzie powtarzać się w każdej iteracji. Tak więc seryjna pętla (zwykle, ale niekoniecznie) poda ci ten sam adres w kółko.
Pętla równoległa
Pomyślmy teraz o równoległej pętli. Ponieważ nie ma synchronizacji, kolejność przydzielania pamięci i deallokacji nie jest określona. Dlatego możliwe jest ich przeplatanie w dowolny sposób, jaki możesz sobie wyobrazić. Tak więc przydzielający pamięć nie będzie mógł użyć tej samej sztuczki, co poprzednio, aby zawsze rozdawać tę samą pamięć.Przykład zamawiania może być, na przykład, że wszystkie cztery A
s get zbudowane przed wszyscy dostać zniszczone - coś takiego:
- budowlany
- budowa
- budowa
- budowa
- zniszczenie
- zniszczenie
- zniszczenie
- zniszczenie
podzielnika pamięć będzie zatem musiał służyć 4 nowe kawałki pamięci zanim może trochę plecy i zacząć recyklingu.
Zachowanie wersji opartej na stosie jest nieco bardziej deterministyczne, ale może zależeć od optymalizacji kompilatora. W przypadku wersji szeregowej za każdym razem, gdy obiekt jest tworzony/niszczony, wskaźnik stosu jest regulowany. Ponieważ nic się między nimi nie dzieje, nadal będzie się tworzyć w tej samej lokalizacji.
W wersji równoległej każdy wątek ma własny stos we wspólnym systemie pamięci. Dlatego każdy wątek będzie tworzyć obiekty w innym miejscu pamięci i nie będzie możliwe "ponowne przetwarzanie".
Zachowanie, które widzisz, nie jest w żaden sposób dziwne ani nie jest gwarantowane. Zależy to od ilości fizycznych rdzeni, liczby uruchomionych wątków, liczby iteracji, z których korzystasz - ogólnie warunków pracy.
Dolna linia: wszystko jest w porządku, nie powinieneś czytać za dużo.
a dół 5 sekund po wysłaniu? czemu ? – PinkFloyd