golang--sync.WaitGroup使用示例


golang中有2種方式同步程序,一種使用channel,另一種使用鎖機制。使用channel的案例可以參考我的博客:golang--使用channel來同步goroutine,這里要涉及的是鎖機制,更具體的是sync.WaitGroup,一種較為簡單的同步方法集。

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

要注意的有一點。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已經改正過來了。

轉貼請注明來自:格通


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM