Sobes.tech
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
}

ეს მიდგომა უზრუნველყოფს, რომ მონაცემები არ დაიზიანოს კონკურენტული წვდომის დროს.