Sobes.tech
Middle

Ի՞նչ mutex-ներ եք օգտագործում, ապահովելու համար անվտանգությունը Go-ում քարտերով աշխատելիս։

sobes.tech AI

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

Որպեսզի ապահովվի անվտանգությունը տվյալների կառուցվածքների հետ աշխատելիս, ներառյալ քարտեզները (map), Go-ում օգտագործվում են sync փաթեթի mutex-ներ:

  • sync.Mutex: Հիմնական mutex՝ փոխադարձ բացառության համար: Օգտագործվում է կոդի հատվածների փակման և բացման համար, որտեղ կատարվում է ընթերցում կամ գրառում քարտեզում:
  • sync.RWMutex: Կիսաբաժան (ընթերցում) և բացառիկ (գրառում) մուտք ունեցող mutex: Հնարավորություն է տալիս միաժամանակ մի քանի goroutine-ների ընթերցել քարտեզից, բայց միայն մեկին՝ գրել:

Նախընտրելի տարբերակն է sync.RWMutex-ը, քանի որ այն ապահովում է ավելի լավ կատարողականություն միաժամանակյա ընթերցումների դեպքում:

import (
	"sync"
)

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

func NewSafeMap() *SafeMap {
	return &SafeMap{
		m: make(map[string]int),
	}
}

func (sm *SafeMap) Set(key string, value int) {
	sm.mu.Lock()   // Բլոկավորում գրելու համար
	defer sm.mu.Unlock()
	sm.m[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
	sm.mu.RLock()  // Բլոկավորում ընթերցելու համար
	defer sm.mu.RUnlock()
	value, ok := sm.m[key]
	return value, ok
}

Կա նաև sync.Map հատուկ տիպ, որը օպտիմալիզացված է միաժամանակյա օգտագործման համար առանց mutex-ների բացահայտ փակման, սակայն ունի որոշ սահմանափակումներ և այլ API: Եթե անհրաժեշտ է ավելի ճկուն վերահսկողություն mutex-ների վրա կամ հատուկ մուտքի սցենարներ, sync.RWMutex-ի օգտագործումը սովորական պրակտիկա է։