Sobes.tech
Principal
48

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

Сұралған компаниялар
Позитив Технолоджис

AI-дан жауап

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 обеспечивает взаимное исключение и предотвращает состояние гонки при доступе к общей переменной.