Sobes.tech
Назад к вопросам
Principal
4

Почему добавление mutex только на запись не решает проблему data race? Как правильно использовать mutex для защиты общей переменной?

Компании, где спрашивали
Позитив Технолоджис

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

sobes.tech AI

Добавление mutex только на запись не решает проблему data race, потому что:

  • Если чтение происходит без блокировки, оно может получить частично обновлённые или неконсистентные данные, если в этот момент другая горутина или поток выполняет запись.
  • Data race возникает при одновременном доступе к общей переменной, когда хотя бы один доступ — запись, и при этом отсутствует надлежащая синхронизация.

Правильное использование mutex для защиты общей переменной:

  • Блокировать mutex и при чтении, и при записи. Это гарантирует, что чтение не произойдёт одновременно с записью.
  • При записи захватывать mutex, изменять данные, затем освобождать mutex.
  • При чтении также захватывать mutex, читать данные, затем освобождать mutex.

Пример на Swift:

let mutex = DispatchSemaphore(value: 1)
var sharedData = 0

func writeData(newValue: Int) {
    mutex.wait()
    sharedData = newValue
    mutex.signal()
}

func readData() -> Int {
    mutex.wait()
    let value = sharedData
    mutex.signal()
    return value
}

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