Middle+
Τι θα εμφανιστεί κατά την εκτέλεση του προγράμματος: func main() { counter := make([]int, 0, 1000) var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() counter = append(counter, i) time.Sleep(10 * time.Millisecond) // Προσομοίωση εργασίας }() } wg.Wait() fmt.Println(len(counter)) }
sobes.tech AI
Απάντηση από AI
Το πρόγραμμα περιέχει έναν αγώνα δεδομένων κατά την εγγραφή στη σειρά counter από πολλαπλές goroutines χωρίς συγχρονισμό. Αυτό οδηγεί σε απρόβλεπτη συμπεριφορά.
Τι συμβαίνει:
- Δημιουργείται μια σειρά
counterμε μήκος 0 και χωρητικότητα 1000. - Ξεκινάει 1000 goroutines, καθεμία προσπαθεί να προσθέσει την τιμή
iστη σειρά. - Η λειτουργία
appendδεν είναι ασφαλής για νήματα, πολλαπλές goroutines τροποποιούν ταυτόχρονα τη σειρά. - Λόγω του αγώνα δεδομένων, μπορεί να χαθούν δεδομένα, να καταστραφεί η σειρά ή να προκληθεί panic.
Στο τέλος:
- Η τιμή του
len(counter)μπορεί να είναι μικρότερη από 1000, καθώς ορισμένες εγγραφές μπορεί να χαθούν. - Μπορεί να προκληθεί panic ή λανθασμένη έξοδος.
Η σωστή προσέγγιση είναι η χρήση mutex ή καναλιού για συγχρονισμό της πρόσβασης στη σειρά:
var mu sync.Mutex
for i := 0; i < 1000; i++ {
wg.Add(1)
go func(val int) {
defer wg.Done()
mu.Lock()
counter = append(counter, val)
mu.Unlock()
time.Sleep(10 * time.Millisecond)
}(i)
}
Ή χρήση δομών δεδομένων ασφαλών για νήματα.