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 [ ;***** zmiana wartości :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 [ ;**** obliczenie sumy :my *****
    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