Rozproszone_moje_zad/TEMAT_B/zad30.tcl
Jakub Adamski a59be95770 Temat B
2021-05-23 13:11:45 +02:00

81 lines
1.9 KiB
Tcl

load ./q3.so
source symul_lib.tcl
# inicjalizacja wierzchołków
set liczbaWierz 20
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 {
while {$run} {
set bezpieczny 0;
# do wszystkich sąsiadów wysyłam ID
for {set i 0} {$i < $stopien} {incr i} {
dostarcz $i $id;
}
# koniec wykonania
fiber switchto main;
# potwierdzenie otrzymania komunikatu
for {set i 0} {$i < $stopien} {incr i} {
czytaj $i;
}
# jeśli odebrałem komunikat to wysyłam safe
for {set j 0} {$j < $stopien} {incr j} {
dostarcz $j "SAFE";
}
#koniec wykonania
fiber switchto main;
while {$bezpieczny == 0} {
set licz 0;
for {set i 0} {$i < $stopien} {incr i} {
# zwiększam licz jeśli pierwszy to safe
if {[lindex $kom($i) 0]=="SAFE"} {
incr licz;
}
# otrzymałem safe od każdego sąsiada
if {$licz == $stopien} {
set bezpieczny 1;
# usuwam safe z listy
for {set j 0} {$j < $stopien} {incr j} {
czytaj $j;
}
} else {
set bezpieczny 0;
}
}
fiber switchto main;
}
}
}
InicjalizacjaAsynch
# pokaż komunikaty
fiber switchto 0; pokazKom
fiber switchto 1; pokazKom
fiber switchto 2; pokazKom
fiber switchto 3; pokazKom
fiber switchto 4; pokazKom
fiber switchto 5; pokazKom
fiber switchto 6; pokazKom
fiber switchto 7; pokazKom