Sobes.tech
Junior — Middle

Как да осигурим безопасен достъп до картата в многонишкова среда?

sobes.tech AI

Отговор от AI

В Go е необходимо да се използва синхронизация за безопасен достъп до карта (map) в многопоточна среда, тъй като map не е структура от данни, безопасна за потоци. Най-често срещаният начин е използването на мьютекс (sync.Mutex или sync.RWMutex) за блокиране на достъпа при четене и писане.

Пример с използване на sync.RWMutex:

import (
    "sync"
)

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

func read(key string) int {
    mu.RLock()         // блокира за четене
    defer mu.RUnlock()
    return m[key]
}

func write(key string, value int) {
    mu.Lock()          // блокира за писане
    defer mu.Unlock()
    m[key] = value
}

Също така в Go има тип sync.Map, който реализира потокобезопасна карта с оптимизации за чести операции по четене. Може да се използва, ако не е необходима строга типизация и желаете простота:

import "sync"

var m sync.Map

m.Store("key", 42)          // записване
value, ok := m.Load("key")  // четене

По този начин, за безопасен достъп до map в многопоточна среда, използвайте мьютекси или sync.Map.