Junior — Middle
Μπορεί να κλείσει ένα κανάλι από πολλαπρα goroutines ταυτόχρονα;
sobes.tech AI
Απάντηση από AI
Όχι, δεν είναι δυνατόν να κλείσετε το ίδιο κανάλι από πολλαπρα goroutines ταυτόχρονα. Στο Go, ένα κανάλι πρέπει να κλείνει ακριβώς μία φορά, και συνήθως το κάνει η goroutine που είναι υπεύθυνη για την αποστολή δεδομένων στο κανάλι.
Αν πολλαπλά goroutines προσπαθήσουν να κλείσουν το κανάλι, αυτό θα οδηγήσει σε panic (runtime panic).
Η σωστή προσέγγιση:
- Ορίστε μια μόνο goroutine υπεύθυνη για το κλείσιμο του καναλιού.
- Χρησιμοποιήστε επιπλέον μηχανισμούς συγχρονισμού (π.χ., sync.Once) για να διασφαλίσετε ότι το κλείσιμο θα γίνει μόνο μία φορά.
Παράδειγμα με sync.Once:
var once sync.Once
func closeChannel(ch chan int) {
once.Do(func() {
close(ch)
})
}
Έτσι, ακόμα και αν πολλαπλά goroutines καλέσουν το closeChannel, το κανάλι θα κλείσει μόνο μία φορά.