Sobes.tech
Middle+

Картанын эсинде атаандаштык жазуу учурунда каталардан кантип коргоо керек?

sobes.tech AI

AIден жооп

Гонку коргоо үчүн map ичинде Golangда, ал алдын ала ишенимдүү эмес, төмөнкү механизмдер колдонулат:

  • sync.Mutex: жазуу алдында mapти жабуу жана жазуудан кийин ачуу.

    import "sync"
    
    type SafeMap struct {
        mu sync.Mutex
        data map[string]int
    }
    
    func NewSafeMap() *SafeMap {
        return &SafeMap{
            data: make(map[string]int),
        }
    }
    
    func (sm *SafeMap) Set(key string, value int) {
        sm.mu.Lock()
        defer sm.mu.Unlock()
        sm.data[key] = value
    }
    
    func (sm *SafeMap) Get(key string) (int, bool) {
        sm.mu.Lock()
        defer sm.mu.Unlock()
        val, ok := sm.data[key]
        return val, ok
    }
    
  • sync.RWMutex: бир нече горутиналар mapтен бир убакта окуй алат, бирок жазуу учурда блоктолот.

    import "sync"
    
    type SafeMapRWMutex struct {
        mu sync.RWMutex
        data map[string]int
    }
    
    func NewSafeMapRWMutex() *SafeMapRWMutex {
        return &SafeMapRWMutex{
            data: make(map[string]int),
        }
    }
    
    func (sm *SafeMapRWMutex) Set(key string, value int) {
        sm.mu.Lock() // Жазуу үчүн блоктоо
        defer sm.mu.Unlock()
        sm.data[key] = value
    }
    
    func (sm *SafeMapRWMutex) Get(key string) (int, bool) {
        sm.mu.RLock() // Окуу үчүн блоктоо
        defer sm.mu.RUnlock()
        val, ok := sm.data[key]
        return val, ok
    }
    
  • sync.Map: Специализированный тип, безопасный для потоков, оптимизированный для сценариев, где набор ключей относительно стабилен, записи редки, или когда несколько горутин читают и пишут для дизъюнктивных наборов ключей.

    import "sync"
    
    var safeMap sync.Map // Декларация
    
    func UseSyncMap() {
        safeMap.Store("key1", 10) // Запись
        if val, ok := safeMap.Load("key1"); ok { // Чтение
            // Используйте val
        }
        safeMap.Delete("key1") // Удаление
    }
    

Жоопторду салыштыруу:

Механизм Артыкчылыктары Кемчиликтери Колдонуу
sync.Mutex Жөнөкөй колдонуу Бардык операцияларды блоктойт жазуу учурунда Жөнөкөй сценарийлер, конкуренция жогорку эмес же окуу/жазуу дээрлик бирдей.
sync.RWMutex Көптөгөн горутиналардан бир убакта окууга мүмкүндүк берет sync.Mutexке караганда татаал. Жазуу окууну жана башка жазууларды блоктойт Жыш окуу жана сейрек жазуу сценарийлери.
sync.Map Айрым сценарийлер үчүн оптималдаштырылган API чектелүү. Эгер жетүү толугу менен кездейсөз болсо, Mutexке караганда жайыраак болушу мүмкүн. Көпчүлүк учурда туруктуу ачкычтар же дисжунктивдүү ачкыч топтомдору менен жетүү сценарийлери.

Туура механизм тандоо жетүү характерине көз каранды. Жалпысынан, sync.Mutex же sync.RWMutex жетиштүү. Спецификалык сценарийлер үчүн sync.Map жакшы натыйжа бере алат.