次のように、マップに同時にアクセスできるプログラムがあるとします。
func getKey(r *http.Request) string { ... }
values := make(map[string]int)
http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) {
key := getKey(r)
fmt.Fprint(w, values[key])
})
http.HandleFunc("/set", func(w http.ResponseWriter, r *http.Request) {
key := getKey(r)
values[key] = rand.Int()
})
マップの書き込みは非アトミックであるため、これは悪いことです。したがって、読み取り/書き込みミューテックスを使用できます
func getKey(r *http.Request) string { ... }
values := make(map[string]int)
var lock sync.RWMutex
http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) {
key := getKey(r)
lock.RLock()
fmt.Fprint(w, values[key])
lock.RUnlock()
})
http.HandleFunc("/set", func(w http.ResponseWriter, r *http.Request) {
key := getKey(r)
lock.Lock()
values[key] = rand.Int()
lock.Unlock()
})
チャネルではなくミューテックスを直接使用しているという事実を除けば、これは問題ないようです。
これを実装するより慣用的な方法は何ですか? それとも、これは本当にミューテックスだけで十分な時代の 1 つですか?