Rozproszone_moje_zad/TEMAT_B/zad19.tcl

81 lines
1.7 KiB
Tcl
Raw Normal View History

2021-05-23 13:11:45 +02:00
load ./q3.so
source symul_lib.tcl
# tworzę wierzchołki
set liczbaWierz 5
iterate i $liczbaWierz {
let ipierwsze $i-1;
if {$ipierwsze==-1} {let ipierwsze $liczbaWierz-1}
let idrugie $i+1;
if {$idrugie==$liczbaWierz} {let idrugie 0}
set sasiedzi($i) "$ipierwsze $idrugie"
}
# definiuję wierzchołki
fiber create $liczbaWierz {
# te zmienne są wymagane do wizualizacji
set lider {};
set minimalneId {};
fiber yield;
# Cykl zorientowany - wysyłam połączeniem 0, odbieram połączeniem 1
dostarcz 0 "LE $id";
while {$run} {
set msg [lindex [czytaj 1] 1];
if {$msg!=""} {
if {$msg<$id} {
dostarcz 0 "LE $msg";
set minimalneId $msg;
} elseif {$msg==$id} {
set lider 1;
set minimalneId $msg;
dostarcz 0 "LE false";
} elseif {$msg=="false" && $lider=={}} {
set lider 0;
dostarcz 0 "LE false";
}
}
#koniec wykonywania procedury danego wierzchołka
fiber switchto main;
}
}
InicjalizacjaAsynch
#procedura wizualizacji
proc wizualizacja {} {
fiber_iterate {_puts "id: $id, lider: $lider, minimalneId: $minimalneId, kom0: $kom0, kom1: $kom1"}
}
#licznik
set licz 0;
proc egzekucja {liczbaWierz licz args} {
#losowanie
set random [expr {int(rand()*[expr $liczbaWierz+1])}];
for {set i 0} {$i < $liczbaWierz} {incr i} {
if {$i!=$random && $licz!=0} {
_puts "Działa wierzchołek: $i"
fiber switchto $i;
} elseif {$licz==0} {
_puts "Działa wierzchołek: $i"
fiber switchto $i;
}
}
set licz [expr $licz + 1];
}
#wykonanie
egzekucja $liczbaWierz $licz; set licz 1; wizualizacja;