Senior
Fərqli gorutinlərdən Get və Set metodlarını çağırarkən hansı münaqişə problemləri yaranır? Onları necə həll etmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Fərqli goroutine-lərdən eyni zamanda Get və Set metodlarının çağırılması məlumat yarışması (data race) problemini yaradır. Bu, bir neçə goroutine-in eyni zamanda ümumi məlumatları oxuya və dəyişə biləcəyi və bunun nəticəsində proqnozlaşdırılmayan davranışlar və səhvlərə səbəb ola biləcəyi anlamına gəlir.
Bu problemi Go-da həll etmək üçün adətən aşağıdakı metodlar istifadə olunur:
- Mutex (sync.Mutex) — əməliyyat zamanı məlumatlara girişə mane olur, eksklüziv giriş təmin edir.
- RWMutex (sync.RWMutex) — bir neçə goroutine-in eyni zamanda məlumatları oxumasına imkan verir, lakin yazma zamanı yazanı bloklayır.
- Kanallar (channels) — məlumatlara ardıcıl girişin təşkili üçün mesajların ötürülməsi vasitəsilə.
RWMutex istifadə edən nümunə:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // oxumaq üçün kilid
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // yazmaq üçün kilid
defer m.mu.Unlock()
m.data[key] = value
}
Bu yanaşma, məlumatların eyni zamanda giriş zamanı pozulmasının qarşısını alır.