Sobes.tech
Middle

Go'da xaritalar bilan ishlashda xavfsizlikni ta'minlash uchun qanday mutexlardan foydalanasiz?

sobes.tech AI

AIdan javob

Go'da ma'lumotlar tuzilmalariga, jumladan xaritalar (map) ga, bir vaqtning o'zida kirishni xavfsiz qilish uchun sync paketidan mutexlar ishlatiladi.

  • sync.Mutex: Asosiy mutex, o'zaro bloklash uchun. Xarita o'qish yoki yozish jarayonida kod bo'laklarini bloklash va ochish uchun ishlatiladi.
  • sync.RWMutex: Bo'linadigan (o'qish) va eksklyuziv (yozish) kirish bilan mutex. Bir nechta goroutinlar xaritadan bir vaqtning o'zida o'qishi mumkin, lekin faqat biri yozishi mumkin. Bu, o'qish yozishdan ancha ko'p bo'lsa, ideal.

Keng tarqalgan va xavfsiz tarzda ishlash uchun sync.RWMutex afzalroq, chunki u ko'p vaqtli o'qish operatsiyalarida yaxshiroq ishlashni ta'minlaydi.

sync.RWMutex dan foydalanish misoli:

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()   // Yozish uchun bloklash
	defer sm.mu.Unlock()
	sm.m[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
	sm.mu.RLock()  // O'qish uchun bloklash
	defer sm.mu.RUnlock()
	value, ok := sm.m[key]
	return value, ok
}

Shuningdek, sync.Map nomli maxsus tur mavjud bo'lib, u ko'p holatlarda mutexlar bilan ochiq bloklashsiz ishlash uchun optimallashtirilgan, ammo cheklovlar va boshqa API'ga ega. Agar sizga bloklashlarni yanada moslashuvchan nazorat qilish yoki maxsus kirish senariyalari kerak bo'lsa, sync.RWMutex ni standart map ustiga qo'llash keng tarqalgan amaliyotdir.