Senior
რა პრობლემები წარმოიქმნება კონკურენტული წვდომის დროს, როდესაც ვიძახებთ Get და Set მეთოდებს სხვადასხვა გორუტინიდან? როგორ უნდა გადავწყვიტოთ ისინი?
sobes.tech AI
პასუხი AI-სგან
როდესაც მეთოდები Get და Set ერთდროულად გამოიძახება სხვადასხვა goroutines-დან, წარმოიქმნება მონაცემთა რბოლა (data race). ეს ხდება იმიტომ, რომ რამდენიმე goroutine ერთდროულად შეუძლია წაიკითხოს და შეცვალოს საერთო მონაცემები, რაც იწვევს გაუთვალისწინებელ ქცევას და შეცდომებს.
ამ პრობლემის გადაჭრისთვის Go-ში ჩვეულებრივ გამოიყენება:
- Mutex (sync.Mutex) — ბლოკავს მონაცემებზე წვდომას ოპერაციის დროს, უზრუნველყოფს ექსკლუზიურ წვდომას.
- RWMutex (sync.RWMutex) — საშუალებას აძლევს რამდენიმე goroutine-ს ერთდროულად წაიკითხოს მონაცემები, მაგრამ ბლოკავს დაწერას, თუ ვინმე წერს.
- კანალები (channels) — ორგანიზება სექვენციული წვდომისთვის მონაცემებზე შეტყობინებების გადაცემით.
RWMutex-ის გამოყენების მაგალითი:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // წაკითხვის ბლოკირება
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // დაწერის ბლოკირება
defer m.mu.Unlock()
m.data[key] = value
}
ეს მიდგომა უზრუნველყოფს, რომ მონაცემები არ დაიზიანოს კონკურენტული წვდომის დროს.