bild
Skolan för
elektroteknik
och datavetenskap

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.
Copyright © Sidansvarig: Stefan Nilsson <snilsson@nada.kth.se>
Uppdaterad 2014-02-16