在 Go 语言中,sync.Cond 是一个条件变量,它提供了类似于 POSIX 线程条件变量的功能,用于 Goroutine 之间的同步和通信。sync.Cond 可以用于等待某个特定条件的满足,然后通知等待的 Goroutine,以便它们可以继续执行。
sync.Cond 的使用过程主要包括以下几个步骤:
- 1、创建一个 sync.Cond 对象
- 2、对需要等待的条件进行加锁
- 3、在等待条件之前调用 sync.Cond.Wait 方法进行等待
- 4、在条件满足时调用 sync.Cond.Signal 或 sync.Cond.Broadcast 方法唤醒等待的 Goroutine
- 5、在条件满足后解锁
下面是一个使用 sync.Cond 进行 Goroutine 的条件变量同步的示例代码:
package main
import (
"fmt"
"sync"
"time"
)
var (
count int
cond *sync.Cond = sync.NewCond(&sync.Mutex{})
)
func main() {
go func() {
for i := 0; i < 10; i++ {
time.Sleep(1 * time.Second)
increment()
}
}()
go func() {
for i := 0; i < 10; i++ {
time.Sleep(2 * time.Second)
decrement()
}
}()
time.Sleep(30 * time.Second)
}
func increment() {
cond.L.Lock()
defer cond.L.Unlock()
count++
fmt.Printf("Incremented: %d",count)
}