複数のゴルーチンがnotifyAll funcを実行する場合、ロックなしでレンジマップを設定することは安全ですか?実際にある範囲では、時々マップからエントリを削除する必要があります。範囲の前にRLockマップする必要がありますか?
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...
}
「自己」の問題は何ですか、これはOCDの一種ですか? – Alex
実際には、Goクリエイター自身、コミュニティの大部分と一緒に見下されています。 https://github.com/golang/go/wiki/CodeReviewComments#receiver-namesもhttp://programmers.stackexchange.com/questions/286406/use-of-this-in-golangを確認してください – OneOfOne