Sobes.tech
Senior

κύριο πακέτο εισαγωγή ( "fmt" ) λειτουργία main() { c := make(chan string) go fmt.Println(<-c) c <- "Γειά σου Κόσμε!" fmt.Println("Έξοδος!") } θανατηφόρο σφάλμα: όλοι οι goroutines κοιμούνται - deadlock! goroutine 1 [λήψη καναλιού]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Το πρόγραμμα τερματίστηκε: κατάσταση 2.

sobes.tech AI

Απάντηση από AI

Το σφάλμα fatal error: all goroutines are asleep - deadlock! συμβαίνει όταν όλες οι goroutines είναι μπλοκαρισμένες και καμία δεν μπορεί να συνεχίσει.

Σε αυτόν τον κώδικα:

c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")

Το κανάλι c δημιουργείται χωρίς buffer, επομένως η λειτουργία αποστολής (c <-) και λήψης (<-c) πρέπει να συμβαίνουν ταυτόχρονα.

Επεξήγηση:

  • Η goroutine go fmt.Println(<-c) προσπαθεί να λάβει μια τιμή από το κανάλι c.
  • Η κύρια goroutine προσπαθεί να στείλει την τιμή "Hello World!" στο κανάλι c.

Ωστόσο, επειδή το fmt.Println(<-c) τρέχει σε μια ξεχωριστή goroutine και η αποστολή γίνεται στην κύρια, μπορεί να συμβεί η goroutine ανάγνωσης να μην είναι ακόμα έτοιμη να λάβει δεδομένα, και η κύρια goroutine να μπλοκάρει στην αποστολή.

Ως αποτέλεσμα, και οι δύο goroutines μπλοκάρουν: η μία περιμένει να στείλει, η άλλη να λάβει, αλλά καμία δεν μπορεί να συνεχίσει — προκύπτει deadlock.

Για να διορθωθεί αυτό, μπορείτε:

  • Να κάνετε το κανάλι με buffer, π.χ. c := make(chan string, 1), ώστε η αποστολή να μην μπλοκάρει.
  • Ή να αλλάξετε τη σειρά των λειτουργιών, στέλνοντας πρώτα και διαβάζοντας μετά.

Παράδειγμα με buffer:

c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")

Τώρα το πρόγραμμα θα τρέξει χωρίς deadlock.