Sobes.tech
Senior

Ի՞նչ խնդիրներ են առաջանում մրցակցային մուտքի ժամանակ, երբ կանչում եք Get և Set մեթոդները տարբեր գորուտիներից: Ինչպե՞ս լուծել դրանք։

sobes.tech AI

Պատասխան AI-ից

Երբ Get և Set մեթոդները միաժամանակ կանչվում են տարբեր goroutines-ներից, առաջանում է տվյալների մրցավազքի (data race) խնդիր: Դա տեղի է ունենում, քանի որ միաժամանակ մի քանի goroutine կարող է ընթերցել և փոփոխել ընդհանուր տվյալները, ինչը հանգեցնում է կանխատեսելի olmayan վարքագծի և սխալների:

Այս խնդիրը լուծելու համար Go-ում սովորաբար օգտագործվում են՝

  • Mutex (sync.Mutex) — մուտք գործելու ժամանակ արգելափակում է տվյալները, ապահովելով բացառիկ մուտք:
  • RWMutex (sync.RWMutex) — թույլ է տալիս միաժամանակ մի քանի goroutine-ների ընթերցել տվյալները, բայց արգելափակում գրառումը, եթե մեկը գրում է:
  • Կանալներ (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
}

Այս մոտեցումը ապահովում է, որ տվյալները չեն վնասվի միաժամանակյա մուտք գործելիս։