Back to questions
Principal
3
Почему добавление mutex только на запись не решает проблему data race? Как правильно использовать mutex для защиты общей переменной?
Companies where asked
Позитив Технолоджис
Answer from 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 обеспечивает взаимное исключение и предотвращает состояние гонки при доступе к общей переменной.