在Go语言中sync.Cond代表条件变量,主要作用就是获取锁之后,wait()方法会等待一个通知,来进行下一步锁释放等操作,以此控制锁合适释放,释放频率。需要配置锁才能有用c := sync.NewCond(&sync.RWMutex{})。通常项目中会结合sync.WaitGroup一起用,用来控制并发频率。
结构体 定义:
type Cond struct {
noCopy noCopy
L Locker //锁
notify notifyList //通知列表,调用Wait()方法的routine会被放入list中,每次唤醒,从这里取出
checker copyChecker
}
Signal ()//唤醒在Wait的routine中的一个
Broadcast ()//唤醒所有等待的
示例:
package main
import (
“fmt”
“sync”
“time”
)
var Lock er = new(sync.Mutex)
var cond = sync.NewCond(locker)
func test(x int) {
cond.L.Lock() //获取锁
cond.Wait()//等待通知 暂时阻塞
fmt.Println(x)
time.Sleep(time.Second * 1)
cond.L.Unlock()//释放锁
}
func main() {
for i := 0; i < 10; i++ {
go test(i)
}
fmt.Println(“预备”)
time.Sleep(time.Second * 1)
fmt.Println(“砰!”)
cond.Signal() // 下发一个通知给已经获取锁的goroutine
time.Sleep(time.Second * 1)
cond.Signal()// 1秒之后 下发一个通知给已经获取锁的goroutine
time.Sleep(time.Second * 5)
cond.Broadcast()//5秒之后 下发广播给所有等待的goroutine
time.Sleep(time.Second * 10)
}
执行结果:
预备
砰!
1
5
2
4
6
3
0
7
8
9
更多内容请关注每日编程,每天进步一点。