【Golang中WaitGroup的用法和原理】

时间:2024-10-11 07:27:47

Golang中WaitGroup的用法和原理

Go语言中的WaitGroup是一种非常有用的工具,它允许我们在并发编程中等待goroutine的完成。这篇文章将介绍WaitGroup的基本概念、用法和实现原理。

WaitGroup的基本概念

WaitGroup是Go语言中的一个结构体,它包含了一个计数器。WaitGroup的主要作用是等待一组goroutine执行完毕。在程序中,WaitGroup通常与goroutine和channel配合使用,以协调多个goroutine之间的操作。

WaitGroup的用法

WaitGroup的使用非常简单。创建一个WaitGroup对象后,可以使用Add方法向计数器添加值,然后使用Done方法从计数器减去值。最后,Wait方法将阻塞当前goroutine,直到计数器归零。

下面是一个简单的例子,其中三个goroutine被启动,它们每个都打印一个数字,然后调用Done来减少计数器:

package main

import (
    "fmt"
    "sync"
)

func main() {
   
    var wg sync.WaitGroup
    for i := 0; i < 3; i++ {
   
        wg.Add(1)
        go func(i int) {
   
            defer wg.Done()
            fmt.Println(i)
        }(i)
    }
    wg.Wait()
}

运行此程序时,您将看到输出结果为0、1和2。这是因为三个goroutine同时运行,并且由于使用了WaitGroup,main函数等待所有goroutine完成后再退出。

WaitGroup的实现原理

WaitGroup的实现原理比较简单。它有一个计数器,初始值为零。当调用Add方法时,它会将计数器加上传入的值。每次调用Done方法时,计数器减去一个值。最后,在调用Wait方法时,程序将阻塞,直到计数器归零。

下面是WaitGroup的源代码:

type WaitGroup struct {
   
    counter int64
    mutex   sync.Mutex
    waiters sync.Cond
}

func (wg *WaitGroup) Add(delta int) {
   
    wg.mutex.Lock()
    defer wg.mutex.