Sobes.tech
Senior

¿Habrá carreras en una tarea con goroutines y un contador? ¿Cómo corregirlo? ¿En qué se diferencia Mutex de Atomic?

sobes.tech AI

Respuesta de la IA

Если несколько горутин одновременно инкрементируют общий счётчик без синхронизации, то возникают гонки данных — результат может быть непредсказуемым из-за одновременного чтения и записи.

Чтобы исправить, можно использовать:

  • 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)
}