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

Live coding: задача на горутины — конкурентный доступ к общим данным, race condition, решение через мьютекс. Разница между sync.Mutex и sync.RWMutex.

Компании, где спрашивали
Веро Трейс

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

sobes.tech AI

В Go конкурентный доступ к общим данным может привести к race condition — состоянию гонки, когда несколько горутин одновременно читают и пишут данные, что вызывает непредсказуемое поведение.

Для решения используют мьютексы из пакета sync:

  • sync.Mutex — простой мьютекс, блокирует доступ к ресурсу для всех остальных горутин, пока он захвачен.
  • sync.RWMutex — расширенный мьютекс с разделением на блокировки для чтения и записи:
    • Множество горутин могут одновременно держать блокировку на чтение (RLock), если нет активной записи.
    • Запись (Lock) эксклюзивна, блокирует и чтение, и другие записи.

Пример с sync.Mutex:

var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}

Пример с sync.RWMutex:

var rwMu sync.RWMutex
var data int

func readData() int {
    rwMu.RLock()
    defer rwMu.RUnlock()
    return data
}

func writeData(val int) {
    rwMu.Lock()
    defer rwMu.Unlock()
    data = val
}

Использование RWMutex эффективно, когда операций чтения значительно больше, чем записи, так как позволяет параллельно читать данные без блокировки друг друга.