golang--sync.WaitGroup使用示例

golang中有2種方式同步程序,一種使用channel,另外一種使用鎖機制。使用channel的案例能夠參考個人博客:golang--使用channel來同步goroutine,這裏要涉及的是鎖機制,更具體的是sync.WaitGroup,一種較爲簡單的同步方法集。html

sync.WaitGroup只有3個方法,Add(),Done(),Wait()。其中Done()是Add(-1)的別名。簡單的來講,使用Add()添加計數,Done()減掉一個計數,計數不爲0, 阻塞Wait()的運行。golang

要注意的有一點。sync文檔已經說明了的,The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished.也就是說,在運行main函數的goroutine裏運行Add()函數,在其餘的goroutine裏面運行Done()函數。這個我是踩過雷了的。函數

最簡單的案例就是sync文檔裏面的example,這裏簡單寫了一個例子。測試

package main import ( "fmt"
    "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 100; i++ { wg.Add(1) } for i := 0; i < 100; i++ { go wg.Done() } fmt.Println("exit") wg.Wait() } func add(wg sync.WaitGroup) { wg.Add(1) } func done(wg sync.WaitGroup) { wg.Done() }

在本身的電腦使用godoc搭載的sync文檔中,有一個bug,註明添加該包的方法是import "pkg/sync"。通常程序都是import "sync"。我本身測試了一下,import "sync"纔是正確的,import "pkg/sync"編譯都通不過各位也能夠測試一下。在golang.org已經改正過來了。spa

轉貼請註明來自:格通code

相關文章
相關標籤/搜索