Ich habe über Gornotines und das Sync-Paket gelesen und meine Frage ist ... Muss ich immer entsperren, wenn das Schreiben von Daten auf verschiedenen goroutines lesen?Go Goroutine Sperre und entsperren
Zum Beispiel habe ich eine Variable auf meinem Server
config := make(map[string]string)
Dann auf verschiedenen goroutines ich von Config lesen möchten. Ist es sicher, ohne Synchronisierung zu lesen, oder nicht?
Ich denke, das Schreiben muss mit dem Sync-Paket erfolgen. aber ich bin nicht sicher
LesenZum Beispiel habe ich ein einfaches In-Memory-Cache-System
type Cache interface {
Get(key string) interface{}
Put(key string, expires int64, value interface{})
}
// MemoryCache represents a memory type of cache
type MemoryCache struct {
c map[string]*MemoryCacheValue
rw sync.RWMutex
}
// MemoryCacheValue represents a memory cache value
type MemoryCacheValue struct {
value interface{}
expires int64
}
// NewMemoryCache creates a new memory cache
func NewMemoryCache() Cache {
return &MemoryCache{
c: make(map[string]*MemoryCacheValue),
}
}
// Get stores something into the cache
func (m *MemoryCache) Get(key string) interface{} {
if v, ok := m.c[key]; ok {
return v
}
return nil
}
// Put retrieves something from the cache
func (m *MemoryCache) Put(key string, expires int64, value interface{}) {
m.rw.Lock()
m.c[key] = &MemoryCacheValue{
value,
time.Now().Unix() + expires,
}
m.rw.Unlock()
}
ich hier sicher bin handeln oder ich muß noch entsperren sperren, wenn ich will nur lesen?
Ich würde das gefälschten Rennen Beispiels loszuwerden, da es weder unterwegs Implementierung von Karten noch Strings gilt, und ist eine Art verwirrend. Sie haben auch "o" und "m" in den ersten Beispielen gemischt, zusammen mit dem Verweis auf die Mutex-Methoden als ein eingebettetes Feld, aber definieren es als "Mutex". – JimB
Korrigiert nach Empfehlung. – Kaedys