go sync.WaitGroup熟悉一下

作用

当主线程启动一组线程之后,WaitGroup会等待这组goroutines完成

sync.WaitGroup的方法

sync.WaitGroup的同步主要是根据内部的一个计数器来操作的,通过内部计数器的值来判断当前需要等待的goroutines的个数.

sync.WaitGroup有如下三个方法:

  • Add():增加当前要等待的goroutine的个数,如果是负数,就是减少等待的goroutine的个数。当小于零时,代码会出现panic

  • Gone():表示当前goroutine执行完成,减少Wait的goroutine的个数,内部执行的是:Add(-1)

  • Wait():阻塞当前主线程,等待goroutine的执行,当wait.Group内部的counter为零时,继续向下执行当前的主线程

注:sync.WaitGroup对象不是一个引用类型,通过函数传递的时候要使用地址,否则传递过去的只是一个当前的copy,不会对当前的对象产生影响

sync.WaitGroup Exmaple

var total struct {
    sync.Mutex
    value int
}

func worker(wg *sync.WaitGroup) {
    defer wg.Done() //wg的counter减一

    for i := 0; i < 100; i++ {
        total.Lock()
        total.value++
        total.Unlock()
    }
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)  //此处添加要等待的goroutine的个数为2
    go worker(&wg)
    go worker(&wg)
    wg.Wait()  //阻塞当前主线程直到wg等待的goroutine的个数为零
    fmt.Println(total.value)
}

注:

var total struct {
    sync.Mutex
    value int
}

type total struct{
    sync.Mutex
    value int
}

这两者的区别:
前者是变量,使用之前不用声明,不能为该变量定义方法,但可以调用该变量中成员的方法,如:

total.Lock()  //合法
func (t total) add(){} //非法

后者是类型,可以为该类型定义方法,也可以调用该类型成员的方法,但在使用之前需要声明,如:

t  = new(total)
t.Lock
func (t total) Add(){}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容