Sobes.tech
Senior

Кадом кифояи дастрасии ҳамзамонӣ ҳангоми даъвати усулҳои Get ва Set аз гуруҳҳои гуногун пайдо мешаванд? Чӣ гуна онҳоро ҳал кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Когато методите Get и Set се извикват едновременно от различни goroutines, възниква проблем с гонка на данни (data race). Това се случва, защото няколко goroutines могат едновременно да четат и променят споделени данни, което води до непредсказуемо поведение и грешки.

За решаване на този проблем в Go обикновено се използват:

  • Мютекс (sync.Mutex) — блокира достъпа до данните по време на операцията, осигурявайки изключителен достъп.
  • RWMutex (sync.RWMutex) — позволява на много goroutines да четат данните едновременно, но блокира писането, ако някой пише.
  • Канали (channels) — за организиране на последователен достъп до данните чрез предаване на съобщения.

Пример с RWMutex:

import "sync"

type SafeMap struct {
    mu sync.RWMutex
    data map[string]string
}

func (m *SafeMap) Get(key string) (string, bool) {
    m.mu.RLock()         // четене блокиране
    defer m.mu.RUnlock()
    val, ok := m.data[key]
    return val, ok
}

func (m *SafeMap) Set(key, value string) {
    m.mu.Lock()          // писане блокиране
    defer m.mu.Unlock()
    m.data[key] = value
}

Този подход гарантира, че данните няма да бъдат повредени при конкуренция при достъп.