Назад к вопросам
Middle+
3
Live coding: задача на горутины — конкурентный доступ к общим данным, race condition, решение через мьютекс. Разница между sync.Mutex и sync.RWMutex.
Компании, где спрашивали
Веро Трейс
Ответ от нейросети
sobes.tech AI
В Go конкурентный доступ к общим данным может привести к race condition — состоянию гонки, когда несколько горутин одновременно читают и пишут данные, что вызывает непредсказуемое поведение.
Для решения используют мьютексы из пакета sync:
sync.Mutex— простой мьютекс, блокирует доступ к ресурсу для всех остальных горутин, пока он захвачен.sync.RWMutex— расширенный мьютекс с разделением на блокировки для чтения и записи:- Множество горутин могут одновременно держать блокировку на чтение (
RLock), если нет активной записи. - Запись (
Lock) эксклюзивна, блокирует и чтение, и другие записи.
- Множество горутин могут одновременно держать блокировку на чтение (
Пример с sync.Mutex:
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
Пример с sync.RWMutex:
var rwMu sync.RWMutex
var data int
func readData() int {
rwMu.RLock()
defer rwMu.RUnlock()
return data
}
func writeData(val int) {
rwMu.Lock()
defer rwMu.Unlock()
data = val
}
Использование RWMutex эффективно, когда операций чтения значительно больше, чем записи, так как позволяет параллельно читать данные без блокировки друг друга.