Uppgift 8 våren 2014
Uppgiften ska lämnas till din övningsledare på övningarna den 4/4.
-
Uppgifterna ska lämnas in på papper. E-post accepteras ej.
-
Samtliga papper ska häftas samman eller lämnas in i en plastficka.
-
Handskriven text accepteras ej.
Lämna in uppgiften med rätt försättsblad:
För godkänt måste du ha gjort samtliga deluppgifter.
Det är tillåtet att göra enstaka fel och misstag men det
är viktigt att du försöker lösa samtliga uppgifter.
Hemuppgift
Läs avnitt 3-5 i
Fundamentals of concurrent programming.
Skriftlig uppgift
Finn två fel
Förklara vad som är fel i nedanstående kod och fixa sedan
programmen så att all data verkligen passerar genom kanalen
och blir utskriven. Lämna in utskrifter av de kompletta programmen.
bug1.go
:
// I want this program to print "Hello world!", but it doesn't work.
func main() {
ch := make(chan string)
ch <- "Hello world!"
fmt.Println(<-ch)
}
bug2.go
:
// This program should go to 11, but sometimes it only prints 1 to 10.
func main() {
ch := make(chan int)
go Print(ch)
for i := 1; i <= 11; i++ {
ch <- i
}
close(ch)
}
// Print prints all numbers sent on the channel.
// The function returns when the channel is closed.
func Print(ch <-chan int) {
for n := range ch { // reads from channel until it's closed
fmt.Println(n)
}
}
Många sändare och många mottagare
Programmet many2many.go
innehåller 4 producenter som tillsammans skickar 32 strängar över en kanal;
i andra änden av kanalen finns 2 konsumenter som tar emot de 32 strängarna.
Förklara vad som händer och varför det händer
om man gör följande ändringar i programmet. Prova att först tänka
ut vad som händer och testa sedan din hypotes genom att ändra och köra programmet.
-
Vad händer om man byter plats på satserna
wgp.Wait()
och
close(ch)
i slutet av main
-funktionen?
-
Vad händer om man flyttar
close(ch)
från
main
-funktionen och i stället stänger kanalen
i slutet av funktionen Produce
?
-
Vad händer om man tar bort satsen
close(ch)
helt och hållet?
-
Vad händer om man ökar antalet konsumenter från 2 till 4?
-
Kan man vara säker på att alla strängar blir utskrivna innan programmet stannar?
Ändra koden genom att lägga till en ny WaitGroup
som väntar tills alla konsumenter blivit klara.
Lämna in koden för det modifierade programmet.
Glöm inte "go fmt"
.
Pythia, oraklet i Delphi
Filen oracle.go innehåller ett kodskelett
till ett orakelprogram som besvarar frågor.
-
Gör klart Oracle-metoden.
Du får inte ändra i main-metoden och
du får inte heller ändra metodsignaturerna.
Observera att svaren inte ska komma direkt, utan med fördröjning.
Glöm inte heller att oraklet ska skriva ut meddelanden även om
det inte kommer några frågor.
Du får gärna dela upp din lösning på flera metoder.
Ditt program ska innehålla två stycken kanaler: en kanal för frågor
samt en kanal för svar och förutsägelser. I Oracle-metoden ska
du starta tre stycken permanenta gorutiner:
- En gorutin som tar emot alla frågor och för varje inkommande
fråga skapar en separat gorutin som besvarar frågan.
- En gorutin som genererar förutsägelser.
- En gorutin som tar emot alla svar och förutsägelser och
skriver ut dem på stdout.
Oracle-metoden är den viktigaste delen av uppgiften.
Om du vill får du också förbättra svarsalgoritmen.
Även här får gärna dela upp algoritmen på flera metoder.
Här är några tips:
- Paketen strings och
regexp kan vara användbara.
- Programmet kan verka mera mänskligt om oraklet skriver ut
sina svar en bokstav i taget.
-
Ta en titt på ELIZA,
det första programmet av det här slaget.