cond是什么
- Cond实现了一种条件变量,可以使用在多个reader等待共享资源ready的场景,(如果只有一读一写,一个锁或者channel就搞定了)
- 每个Cond都会关联一个Lock(*sync.Mutex or *sync.RWMutex), 当修改条件或者调用Wait方法时,必须加锁以保护condition
- 案例:
var (
c = sync.Cond{L: &sync.Mutex{}}
maxNum = 15
)
func main(){
for i := 0; i < maxNum; i++{
go func(i int) {
c.L.Lock()
defer c.L.Unlock()
c.Wait()
fmt.Println("goroutine:", i)
time.Sleep(time.Millisecond * 100)
}(i)
}
c.L.Lock()
maxNum = 16
c.L.Unlock()
c.Broadcast()
time.Sleep(time.Second * 2)
}
Broadcast和Signal的区别
- Broadcast会唤醒所有等待c的goroutine,调用Broadcast的时候,可以加锁也可以不加锁
- Signal只唤醒一个等待c的goroutine,调用Signal的时候,可以加锁也可以不加锁
Cond中Wait使用
- Wait会自动释放c.L锁,并挂起调用者的goroutine,之后恢复执行
- Wait会在返回时对c.L加锁
- 除非被Broadcast或Signal唤醒,否则Wait不会返回
- 由于Wait第一次恢复是,c.L并没有加锁,所以当Wait返回时,调用者通常不能假设条件为真
- 简单来说,只要想使用condition就必须加锁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)