Middle+
38
Тікелей кодтау: горутиналар бойынша тапсырма — ортақ деректерге бір уақытта қол жеткізу, race condition, шешім mutex арқылы. sync.Mutex пен sync.RWMutex арасындағы айырмашылық.
Сұралған компаниялар
Веро Трейс
AI-дан жауап
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 эффективно, когда операций чтения значительно больше, чем записи, так как позволяет параллельно читать данные без блокировки друг друга.