2013-08-30 120 views
2

Wait()被調用後可否重複使用sync.WaitGroupsync.WaitGroup可以安全地重用嗎?

func worker(who string, in <-chan int, wg *sync.WaitGroup) { 
    for i := range in { 
     fmt.Println(who, i) 
     wg.Done() 
    } 
} 

func main() { 
    var wg sync.WaitGroup 

    AIn := make(chan int, 1) 
    BIn := make(chan int, 1) 

    go worker("a:", AIn, &wg) 
    go worker("b:", BIn, &wg) 

    for i := 0; i < 4; i++ { 
     wg.Add(2) 
     AIn <- i 
     BIn <- i 
     wg.Wait() 
     fmt.Println("main:", i) 
    } 
} 

play.golang.org/p/QLsvA-b4Ae按預期運行,但它是保證是安全的嗎?文檔沒有這麼說,但也許我只是偏執狂。

回答

9

是的,它是安全的。事實上,它甚至比這更安全。您可以同時從多個goroutines調用Wait,並根據您的使用情況調用AddDone調用。只要Add發生在Wait之前,你應該是安全的。

只是出於好奇,對現在的WaitGroup與互斥,二int32s計數器和信號量實現:

type WaitGroup struct { 
     m  Mutex 
     counter int32 
     waiters int32 
     sema *uint32 
} 

這也是一個有趣的測試:

var wg1, wg2 sync.WaitGroup 
wg1.Add(1) 
wg1.Done() 
wg1.Wait() 
fmt.Println(wg1 == wg2) // Prints true 

最後,如果您發現有任何此類用途的問題,請報告爲錯誤。

相關問題