猿问

GO里面MAP如何实现key不存在 get操作等待 直到key存在或者超时,保证并发安全求大佬指点!

保证并发安全,实现如下接口
typespinterface{
Out(keystring,valinterface{})//存入key/val,如果该key读取的goroutine挂起,则唤醒。此方法不会阻塞,时刻都可以立即执行并返回
Rd(keystring,timeouttime.Duration)interface{}//读取一个key,如果key不存在阻塞,等待key存在或者超时
}
holdtom
浏览 906回答 2
2回答

跃然一笑

可以利用channel关闭goroutine不阻塞特性来实现:下面的代码可以实现你的需求,只是没有写key被多次写入的判断逻辑。typespinterface{Out(keystring,valinterface{})//存入key/val,如果该key读取的goroutine挂起,则唤醒。此方法不会阻塞,时刻都可以立即执行并返回Rd(keystring,timeouttime.Duration)interface{}//读取一个key,如果key不存在阻塞,等待key存在或者超时}typeMapstruct{cmap[string]*entryrmx*sync.RWMutex}typeentrystruct{chchanstruct{}valueinterface{}isExistbool}func(m*Map)Out(keystring,valinterface{}){m.rmx.Lock()deferm.rmx.Unlock()ife,ok:=m.c[key];ok{e.value=vale.isExist=trueclose(e.ch)}else{e=&entry{ch:make(chanstruct{}),isExist:true,value:val}m.c[key]=eclose(e.ch)}}func(m*Map)Rd(keystring,timeouttime.Duration)interface{}{m.rmx.Lock()ife,ok:=m.c[key];ok&&e.isExist{m.rmx.Unlock()returne.value}elseif!ok{e=&entry{ch:make(chanstruct{}),isExist:false}m.c[key]=em.rmx.Unlock()fmt.Println("协程阻塞->",key)select{case
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答