【发布时间】:2016-04-20 20:46:04
【问题描述】:
在从地图中移除项目之前,我是否会锁定?
package main
import (
"errors"
"sync"
"time"
)
type A struct {
Error error
}
func (a *A) Job() {
// ... more job
}
var l sync.RWMutex
func generate() {
l.Lock()
values["key1"] = A{}
l.Unlock()
l.Lock()
values["key2"] = A{}
values["key3"] = A{}
l.Unlock()
// ...
l.Lock()
values["key1919"] = A{Error: errors.New("oh...")}
l.Unlock()
// ...
l.Lock()
values["key99999999999"] = A{}
l.Unlock()
}
var values map[string]A
func main() {
values = make(map[string]A)
go generate()
for {
l.RLock()
for key, value := range values {
if value.Error != nil {
delete(values, key) // it's safe? or you need to take a lock?
} else {
value.Job()
}
}
l.RUnlock()
time.Sleep(10 * time.Second)
}
}
变体:
在范围内删除而不用担心
在切片中添加键并分隔范围以删除它们
l.RUnlock(); l.Lock();删除(值,键); l.解锁; l.RLock();范围内
go l.delete(key) // gorutin splash
哪个变体是使用锁定/解锁的有效删除?
【问题讨论】:
-
“竞争环境”=“并发环境”? “Die Konkurrenz”在德语中的意思是“竞争”(与并发无关),所以我想知道它在其他语言中是否也令人困惑。
-
并发:)我从俄文翻译成英文的时候已经是深夜了:)俄文变体问题:toster.ru/q/313102
标签: go