WaitGroup是Go語言中的一個并發同步原語,用于等待一組goroutine的完成。它提供了三個主要的方法:Add、Done和Wait。
Add方法用于向WaitGroup中添加要等待的goroutine的數量。Done方法用于表示一個goroutine的完成,即從WaitGroup中減去一個等待的goroutine。Wait方法會阻塞調用它的goroutine,直到所有的等待的goroutine都完成。
WaitGroup的內部實現主要涉及一個計數器和一個條件變量。計數器用于記錄有多少個goroutine還未完成,條件變量用于實現goroutine的阻塞和喚醒。
在WaitGroup的初始化過程中,計數器被設置為0,并且條件變量也被初始化。每次調用Add方法時,計數器會增加指定的數量。每次調用Done方法時,計數器會減少1。在調用Wait方法時,如果計數器大于0,則當前的goroutine會被阻塞,并等待條件變量的通知。當計數器減少到0時,所有等待的goroutine都會被喚醒,繼續執行后續的代碼。
需要注意的是,WaitGroup的計數器是一個有符號的整數,可以為負值。這是因為在某些情況下,可能會調用Add方法增加計數器的數量,而不調用Done方法減少計數器的數量。這種情況下,計數器可能會變成負值。當計數器為負值時,Wait方法會立即返回,而不會阻塞當前的goroutine。
總之,WaitGroup通過計數器和條件變量的組合,實現了一種簡單而高效的等待一組goroutine的完成的機制。它是Go語言中常用的并發同步原語之一,可以方便地控制多個goroutine的并發執行。