Sobes.tech
Intern

Какво ще се случи, ако броячът на sync.WaitGroup стане отрицателен поради допълнителни извиквания на Done в сравнение с Add?

sobes.tech AI

Отговор от AI

Ако броячът на sync.WaitGroup в Go стане отрицателен поради това, че извикванията на Done() са повече от Add(), по време на изпълнение ще настъпи паника (panic).

WaitGroup следи броя на очакваните горутини чрез брояч. При извикване на Add(n), броячът се увеличава с n, а при Done() — намалява с 1. Ако броячът стане по-малък от нула, това се счита за грешка при използването.

Пример за грешка:

var wg sync.WaitGroup
wg.Add(1)
wg.Done()
wg.Done() // допълнително извикване, ще доведе до panic

Паникът възниква с съобщение:

panic: sync: negative WaitGroup counter

Затова е важно да се поддържа строга баланс между Add и Done, за да се избегне тази грешка.