κύριο πακέτο εισαγωγή ( "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.