Sobes.tech
Middle

Go-da xəritələrlə işləyərkən təhlükəsizliyi təmin etmək üçün hansı mutexlərdən istifadə edirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Go-da məlumat strukturları ilə, o cümlədən xəritələr (map) ilə eyni vaxtda girişin təhlükəsizliyini təmin etmək üçün sync paketindən mutexlər istifadə olunur.

  • sync.Mutex: Əsas mutex, qarşılıqlı istisna üçün. Map üzərində oxuma və ya yazma əməliyyatları zamanı kod hissələrini kilidləmək və açmaq üçün istifadə olunur.
  • sync.RWMutex: Paylaşılan (oxuma) və müstəsna (yazma) giriş ilə mutex. Bir neçə goroutine mapdan eyni vaxtda oxuya bilər, amma yalnız biri yaza bilər. Bu, oxuma əməliyyatlarının yazma əməliyyatlarından çox olduğu ssenarilər üçün idealdır.

Map ilə çoxsaylı və təhlükəsiz işləmək üçün üstünlük verilən seçim sync.RWMutex-dir, çünki çoxsaylı eyni vaxtda oxuma əməliyyatlarında daha yaxşı performans təmin edir.

sync.RWMutex istifadə nümunəsi:

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()   // Yazma üçün kilidləmə
	defer sm.mu.Unlock()
	sm.m[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
	sm.mu.RLock()  // Oxuma üçün kilidləmə
	defer sm.mu.RUnlock()
	value, ok := sm.m[key]
	return value, ok
}

Həmçinin, çox hallarda mutex ilə açıq kilidləmədən istifadə üçün optimallaşdırılmış sync.Map adlı xüsusi tip də mövcuddur, lakin müəyyən məhdudiyyətlər və fərqli API-ya malikdir. Əgər daha çevik kilidləmə nəzarəti və ya xüsusi giriş ssenariləri tələb olunursa, sync.RWMutex-in standart map üzərində istifadəsi geniş yayılmış praktikadır.