是的,这很安全。实际上,它比这更安全。您可以同时
Wait从多个goroutine中进行选择,并可以根据您的用例进行适当的互换
Add和
Done调用。只要
Add发生在之前
Wait,您就应该是安全的。
出于好奇,现在
WaitGroup使用互斥锁,两个int32s计数器和一个信号量来实现:
type WaitGroup struct { m Mutex counter int32 waiters int32 sema *uint32}这也是一个有趣的测试:
var wg1, wg2 sync.WaitGroupwg1.Add(1)wg1.Done()wg1.Wait()fmt.Println(wg1 == wg2) // Prints true
最后,如果您发现这种用法有任何问题,请报告,因为这将是一个错误。



