Sobes.tech
Intern

Եթե sync.WaitGroup հաշիվը բացասական դառնա ավելացված Done կանչերի պատճառով, քան Add-ը, ինչ կլինի?

sobes.tech AI

Պատասխան AI-ից

Եթե sync.WaitGroup-ի հաշիվը Go-ում բացասական է դառնում, քանի որ Done() կանչումները ավել են, քան Add(), ապա ժամանակի ընթացքում տեղի կունենա panic ( Panic )։

WaitGroup-ը հետևում է սպասվող goroutine-ների քանակին հաշվիչի միջոցով։ Երբ կանչվում է 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 միջև հավասարակշռությունը՝ այս սխալը կանխելու համար։