[Golang]同步工具-sync包的WaitGroup-心智图总结

1. WaitGroup类型有三个指针方法,Add、Done、Wait
A. 这个类型提供ㄧ个计数器,默认值为0。
B. ㄧ般情况下,会用这个方法来纪录需要等待的goroutine的数量。
C. 通过该类型的Add方法来增加,或者减少计数器的值。
D. Done方法的功能是,对计数器的值进行减ㄧ的操作。
可以在需要等待的goroutine中,通过defer语句调用它
E. Wait方法的功能是,阻塞当前的goroutine,直到其所属值中的计数器归零。
如果Wait方法被调用的时候,计数器的值就是0,它就不会做任何事情。
F. sync.WaitGroup类型计数器的值,不可以小于0

2. 範例程式码

package mainimport ("fmt""sync""sync/atomic""time")func main() {  coordinateWithWaitGroup()}func coordinateWithWaitGroup() {  var wg sync.WaitGroup  wg.Add(2) // 对计数器加2。后面建立两个 goroutine。  num := int32(0)  max := int32(10)  fmt.Printf("The number: %d\n", num)  // 建立两个 goroutine,对num进行原子操作  go addNum(&num, 1, max, wg.Done)  go addNum(&num, 2, max, wg.Done)  wg.Wait() // 阻塞在这里,等待两个 goroutine 执行结束。}// addNum 对numP所指向的变数值,进行原子操作。func addNum(numP *int32, id, max int32, deferFunc func()) {  defer func() {    deferFunc()  }()  for i := 0; ; i++ {    currNum := atomic.LoadInt32(numP)    if currNum >= max {      break    }    newNum := currNum + 2    time.Sleep(time.Millisecond * 200)    if atomic.CompareAndSwapInt32(numP, currNum, newNum) {      fmt.Printf("The number: %d [%d-%d]\n", currNum, id, i)    } else {      fmt.Printf("The CAS operation failed. [%d-%d]\n", id, i)    }  }}

https://play.golang.org/p/qbTXsQJbaon

http://img2.58codes.com/2024/20131728EfbESANP4l.png

参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章