Senior
Turli gorutinlardan Get va Set metodlarini chaqirishda qanday muammo yuzaga keladi? Ularni qanday hal qilish mumkin?
sobes.tech AI
AIdan javob
Bir nechta goroutinlardan bir vaqtning o'zida Get va Set metodlarini chaqirishda, ma'lumotlar urushlari (data race) muammosi yuzaga keladi. Bu shuni anglatadiki, bir nechta goroutinlar bir vaqtning o'zida umumiy ma'lumotlarni o'qish va o'zgartirishlari mumkin, bu esa kutilmagan xatti-harakatlar va xatolarga olib keladi.
Bu muammoni Go tilida hal qilish uchun odatda quyidagilar ishlatiladi:
- Mutex (sync.Mutex) — operatsiya davomida ma'lumotlarga kirishni bloklaydi, faqat bitta kirishni ta'minlaydi.
- RWMutex (sync.RWMutex) — bir nechta goroutinlar bir vaqtning o'zida ma'lumotlarni o'qishiga ruxsat beradi, lekin yozish paytida yozishni bloklaydi.
- Kanal (channels) — xabar yuborish orqali ma'lumotlarga ketma-ket kirishni tashkil qilish.
RWMutex bilan misol:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // o'qish uchun blokirovka
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // yozish uchun blokirovka
defer m.mu.Unlock()
m.data[key] = value
}
Ushbu yondashuv, bir vaqtning o'zida kirish paytida ma'lumotlarning buzilmasligini ta'minlaydi.