Sobes.tech
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.