Sobes.tech
Назад к вопросам
Senior
3

Какая проблема с конкурентным доступом к слайсу без мьютекса? Как это исправить?

Компании, где спрашивали
2gis2gis

Ответ от нейросети

sobes.tech AI

При конкурентном доступе к слайсу в Go без использования мьютекса возникает риск гонок данных (data race). Например, если несколько горутин одновременно читают и записывают в слайс, это может привести к повреждению данных, панике или непредсказуемому поведению программы.

Это происходит потому, что операции добавления, удаления или изменения элементов слайса не атомарны и могут включать изменение внутренней структуры (например, увеличение capacity и выделение новой памяти).

Чтобы исправить эту проблему, нужно синхронизировать доступ к слайсу с помощью мьютекса (sync.Mutex) или других механизмов синхронизации, например, sync.RWMutex для разделения чтения и записи, или использовать каналы для передачи данных между горутинами.

Пример с мьютексом:

var mu sync.Mutex
var slice []int

func appendValue(val int) {
    mu.Lock()
    defer mu.Unlock()
    slice = append(slice, val)
}

func readSlice() []int {
    mu.Lock()
    defer mu.Unlock()
    copied := make([]int, len(slice))
    copy(copied, slice)
    return copied
}

Таким образом, мьютекс гарантирует, что в каждый момент времени только одна горутина изменяет или читает слайс, предотвращая гонки данных.