第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GO里面MAP如何實現(xiàn)key不存在 get操作等待 直到key存在或者超時,保證并發(fā)安全

GO里面MAP如何實現(xiàn)key不存在 get操作等待 直到key存在或者超時,保證并發(fā)安全

犯罪嫌疑人X 2019-05-08 16:47:10
保證并發(fā)安全,實現(xiàn)如下接口typespinterface{Out(keystring,valinterface{})//存入key/val,如果該key讀取的goroutine掛起,則喚醒。此方法不會阻塞,時刻都可以立即執(zhí)行并返回Rd(keystring,timeouttime.Duration)interface{}//讀取一個key,如果key不存在阻塞,等待key存在或者超時}
查看完整描述

2 回答

?
蕭十郎

TA貢獻1815條經(jīng)驗 獲得超13個贊

可以利用channel關(guān)閉goroutine不阻塞特性來實現(xiàn):
下面的代碼可以實現(xiàn)你的需求,只是沒有寫key被多次寫入的判斷邏輯。
typespinterface{
Out(keystring,valinterface{})//存入key/val,如果該key讀取的goroutine掛起,則喚醒。此方法不會阻塞,時刻都可以立即執(zhí)行并返回
Rd(keystring,timeouttime.Duration)interface{}//讀取一個key,如果key不存在阻塞,等待key存在或者超時
}
typeMapstruct{
cmap[string]*entry
rmx*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=val
e.isExist=true
close(e.ch)
}else{
e=&entry{ch:make(chanstruct{}),isExist:true,value:val}
m.c[key]=e
close(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]=e
m.rmx.Unlock()
fmt.Println("協(xié)程阻塞->",key)
select{
case<-e.ch:
returne.value
case<-time.After(timeout):
fmt.Println("協(xié)程超時->",key)
returnnil
}
}else{
m.rmx.Unlock()
fmt.Println("協(xié)程阻塞->",key)
select{
case<-e.ch:
returne.value
case<-time.After(timeout):
fmt.Println("協(xié)程超時->",key)
returnnil
}
}
}
                            
查看完整回答
反對 回復(fù) 2019-05-08
  • 2 回答
  • 0 關(guān)注
  • 863 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號