2016-10-23 2 views
0

Ich suche Gorilla Kontext zum Quellcode. Ich verstehe nicht, was es synchronisiert, mutex.Lock, mutex.Unlock genau. Es läuft immer noch, wenn ich mutex.Lock und Mutex.Unlock aus Quellcodes entfernt habe.Was ist Sync (sync.RWMutex) in Golang

import (
    "net/http" 
    "sync" 
    "time" 
) 

var (
    mutex sync.RWMutex 
    data = make(map[*http.Request]map[interface{}]interface{}) 
    datat = make(map[*http.Request]int64) 
) 

// Set stores a value for a given key in a given request. 
func Set(r *http.Request, key, val interface{}) { 
    mutex.Lock() 
    if data[r] == nil { 
     data[r] = make(map[interface{}]interface{}) 
     datat[r] = time.Now().Unix() 
    } 
    data[r][key] = val 
    mutex.Unlock() 
} 

Antwort

3

Gorrila Kontext assoziierte Datenstrukturen miteinander mittels einer Karte, aber maps are not safe for concurrent use in go.

Damit mehrere Goroutinen sicher auf dieselbe Map zugreifen können, wird der Mutex verwendet, um sicherzustellen, dass nur ein Goro zu einem bestimmten Zeitpunkt Schreibzugriff auf die Map hat.

Jedoch ermöglicht RWMutex seit maps are safe for concurrent reads in go freigegebenen gleichzeitigen Zugriff zum Lesen von Daten aus der Karte durch Aufteilen der beiden Zugriffsrollen, so dass zu keinem Zeitpunkt entweder Schließfächer, ein einzelnes Schreib-Schließfach oder ein oder mehrere vorhanden sind Lesen Sie Schließfächer, die gerade den Mutex halten.

Verwandte Themen