Wykonaj instrukcje z wyłącznym dostępem do zmiennej
lock nazwa [instrukcje]
Blokuje dostęp do zmiennej o podanej nazwie na czas wykonania instrukcji. Jeśli zmienna została wcześniej
zablokowana przez innego żółwia, instrukcja lock
wstrzymuje
wykonanie aż do zwolnienia dostępu do zmiennej.
Przykład:
Aby całkowita suma zmiennej współdzielonej :tot
i zmiennych
:my
w poszczególnych żółwiach była stała, funkcje
take_some
i return_all
mogą być wykonywane tylko przez jednego
żółwia w danym momencie. Wyłączenie instrukcji lock
(zakomentowanie linijek oznaczonych gwiazdkami) spowoduje losową zmianę całkowitej sumy.
Równierz obliczanie sumy jest wykonane w bloku lock
, co zapewnia
blokadę zmian wartości :tot
i :my
.
to model
to take_some
if :tot > 0 [
let "x (random :tot) + 1
"tot -= :x
"my += :x
]
end
to return_all
"tot += :my
"my := 0
end
"my := 0
let "t timer [
lock "tot [
ifelse random 2 = 0 [take_some] [return_all]
]
] (random 10) + 1
end
shared "tot
"tot := 100
"t := newturtles 10 $model
"chk := timer [
let "sum 0
lock "tot [
foreach "ti :t ["sum += :my @ :ti]
(print :sum + :tot :sum :tot)
]
] 300
Rezultat wykonania (wariant 1, kod bez zmian):
100 100 0
100 11 89
100 76 24
100 72 28
100 79 21
100 76 24
...
Rezultat wykonania (wariant 2, kod z wyłączoną instrukcją lock
):
100 100 0
195 168 27
290 288 2
75 40 35
70 43 27
6 6 0
...
Zobacz także:
Zmienne, dostęp do danych
Klasy i dziedziczenie
Spis treści