【发布时间】:2016-09-21 02:28:55
【问题描述】:
如果多个 goroutine 将运行 notifyAll func,那么在不锁定的情况下进行范围映射是否安全?实际上在一个范围内,我有时需要从地图中删除条目。
var mu sync.RWMutex
func (self *Server) notifyAll(event *Event)
ch := make(chan int, 64)
num := 0
for k, v := range self.connections {
num++
ch <- num
go func(int k, conn *Conn) {
err := conn.sendMessage(event)
<-ch
if err != nil {
self.removeConn(k)
}
}(k, v)
}
}
func (self *Server) removeConn(int k) {
mu.Lock()
defer mu.Unlock()
delete(self.connections, k)
}
// Somewhere in another goroutine
func (self *Server) addConn(conn *Conn, int k) {
mu.Lock()
defer mu.Unlock()
self.connections[k] = conn
}
或者我必须在范围之前 RLock 地图?
func (self *Server) notifyAll(event *Event)
mu.RLock()
defer mu.RUnlock()
// Skipped previous body...
}
【问题讨论】:
-
self有什么问题,是不是一种强迫症? -
它实际上被 Go 创造者自己以及社区的大多数人看不起。 github.com/golang/go/wiki/CodeReviewComments#receiver-names 也检查programmers.stackexchange.com/questions/286406/…
标签: dictionary go concurrency