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