Senior
Zullen er races zijn in een taak met goroutines en een teller? Hoe te corrigeren? Wat is het verschil tussen Mutex en Atomic?
sobes.tech AI
Antwoord van 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)
}