Senior
35
Задача с горутинами и счётчиком: будут ли гонки? Как исправить? Чем отличается Mutex от Atomic?
Сұралған компаниялар
Flant
AI-дан жауап
sobes.tech AI
Если несколько горутин одновременно инкрементируют общий счётчик без синхронизации, то возникают гонки данных — результат может быть непредсказуемым из-за одновременного чтения и записи.
Чтобы исправить, можно использовать:
- sync.Mutex — блокирует доступ к счётчику, гарантируя, что только одна горутина изменяет значение в момент времени.
- atomic операции из пакета
sync/atomic— позволяют выполнять атомарные инкременты без блокировок.
Разница между Mutex и Atomic:
- Mutex — это механизм блокировки, который останавливает другие горутины, пока текущая работает с защищённым ресурсом. Подходит для сложных операций с несколькими шагами.
- Atomic — набор низкоуровневых операций, которые гарантируют атомарность изменения переменной без блокировок, обычно быстрее, но ограничены простыми операциями (например, инкремент).
Пример с Mutex:
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
counter++
mu.Unlock()
}
Пример с atomic:
import "sync/atomic"
var counter int64
func increment() {
atomic.AddInt64(&counter, 1)
}