Sobes.tech
Intern

Τι συμβαίνει αν ο μετρητής του sync.WaitGroup γίνει αρνητικός λόγω επιπλέον κλήσεων Done σε σύγκριση με το Add;

sobes.tech AI

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

Αν ο μετρητής του sync.WaitGroup στο Go γίνει αρνητικός λόγω περισσότερων κλήσεων Done() από Add(), θα προκληθεί ένα panic κατά την εκτέλεση.

Το WaitGroup παρακολουθεί τον αριθμό των αναμενόμενων goroutines μέσω ενός μετρητή. Κάνοντας κλήση Add(n), ο μετρητής αυξάνεται κατά n, και με Done() — μειώνεται κατά 1. Αν ο μετρητής γίνει μικρότερος από το μηδέν, θεωρείται σφάλμα χρήσης.

Παράδειγμα σφάλματος:

var wg sync.WaitGroup
wg.Add(1)
wg.Done()
wg.Done() // επιπλέον κλήση, θα προκαλέσει panic

Το panic εμφανίζεται με το μήνυμα:

panic: sync: negative WaitGroup counter

Επομένως, είναι σημαντικό να διατηρείται αυστηρός ισορροπία μεταξύ Add και Done για την αποφυγή αυτού του σφάλματος.