portal Michała Hanćkowiaka
Begin main content
# Przyklad 2 symulacji modelu asynchronicznego
# + jest to alg. wyboru lidera, uzywajacy O(n^2) komunikatow
# + UWAGA! w symulatorze asynch. wierzchołki powinny pracować "w nieskończoność"
#  symulację wył. "ręcznie" gdy stwierdzimy, że nie wysyła się już żadnych komunikatów ...
#

source symul_lib.tcl

set liczbaWierz 20
iterate i $liczbaWierz {
    # petla "iterate i 10" iteruje od 0 do 9
  let i1 $i-1; if {$i1==-1} {let i1 $liczbaWierz-1}
  let i2 $i+1; if {$i2==$liczbaWierz} {let i2 0}
  set sasiedzi($i) "$i1 $i2"
}

fiber create $liczbaWierz {
    set lider {}
    wyslij 1 "LE $id_los"
    while {$run} {
      set id0 [lindex [czytajKomTypu LE 0] 1]
      if {$id0>$id_los} {
        #wyslij 1 "LE $id0"
        wyslij 1 [list LE $id0]
      } elseif {$id0==$id_los} {
        set lider 1; wyslij 1 "LE -1"
      } elseif {$id0==-1 && $lider=={}} {
        set lider 0; wyslij 1 "LE -1"
      }
    }
}
InicjalizacjaAsynch

proc wizualizacja {} {
  fiber_iterate {_puts "$id, $id_los, $lider; $kom0, $kom1"}
}

# ... do tego miejsca mozna wszystko wykonac

if 0 {
zakonczFibery; fiber delete
zakonczFibery; fiber restart
fiber error
zaproponuj
pokazKom
set licznikKom
}

fiber switchto 8; pokazKom
dostarczKom 9 0; pokazKom
fiber switchto 9; pokazKom

.output.t delete 1.0 end; zakonczFibery; fiber restart

# bardzo asynchroniczna egzekucja...
iterate i 10 {fiber switchto [expr {int($liczbaWierz*rand())}]}; pokazKom
iterate i 10 {dostarczKom [expr {int($liczbaWierz*rand())}] 0}; pokazKom






exit

uwaga: portal używa ciasteczek tylko do obsługi tzw. sesji...