Sobes.tech
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)
}

Ή χρήση δομών δεδομένων ασφαλών για νήματα.