Sobes.tech
Back to questions
Middle
7

Как можно избежать гонки данных? Как работает Mutex?

Companies where asked
YadroYadro

Answer from AI

sobes.tech AI

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

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

Принцип работы Mutex:

  • Перед доступом к общему ресурсу горутина вызывает Lock(), блокируя мьютекс.
  • Если мьютекс уже заблокирован, горутина ждет освобождения.
  • После завершения работы с ресурсом вызывается Unlock(), освобождая мьютекс.

Пример использования Mutex в Go:

import (
    "fmt"
    "sync"
)

func main() {
    var mu sync.Mutex
    counter := 0

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

    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }
    wg.Wait()
    fmt.Println("Counter:", counter)
}

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