Sobes.tech
Middle

Goда карталар менен иштөөдө коопсуздукту камсыздоо үчүн кайсы mutexтерди колдонуп жатасыз?

sobes.tech AI

AIден жооп

Go'da ma'lumotlar tuzilmalariga, jumladan xaritalar (map), bilan ishlashda xavfsizlikni ta'minlash uchun sync paketidan mutexlar ishlatiladi.

  • sync.Mutex: Asosiy mutex, o'zaro bloklash uchun. Map ustida 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 mapdan 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.