条件变量(Cond)
条件变量(Cond)是 sync
包中用于等待和通知 goroutine 的机制。条件变量需要和互斥锁配合使用,常用于等待某个条件达成的情况下,通知其它 goroutine 可以继续执行。条件变量有两个主要的方法:Wait()
和 Signal()
。Wait()
方法用于等待条件变量的通知,会自动释放互斥锁,并将当前 goroutine 挂起;Signal()
方法用于通知等待在条件变量上的一个 goroutine 可以继续执行,如果没有等待的 goroutine,则该通知会被忽略。
下面是一个条件变量的示例代码:
代码语言:javascript复制package main
import (
"fmt"
"sync"
)
var count int
var cond *sync.Cond
func increment() {
cond.L.Lock()
defer cond.L.Unlock()
count
if count == 10 {
cond.Signal()
}
}
func main() {
cond = sync.NewCond(&sync.Mutex{})
var wg sync.WaitGroup
for i := 0; i < 10; i {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
cond.L.Lock()
defer cond.L.Unlock()
cond.Wait()
fmt.Println("Count is 10 now!")
wg.Wait()
}
在上面的示例代码中,我们定义了一个全局变量 count
和一个条件变量 cond
。increment()
函数用于将 count
加 1,并在 count
变成 10 时通知等待在 cond
上的 goroutine 可以继续执行。在 main()
函数中,我们启动了 10 个 goroutine 来调用 increment()
函数,最后我们使用 Wait()
方法等待条件变量的通知。当 count
变成 10 时,increment()
函数会调用 Signal()
方法通知等待在 cond
上的 goroutine 可以继续执行,然后我们打印出 "Count is 10 now!",最后使用 wg.Wait()
等待所有的 goroutine 执行完成。