# 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