Sobes.tech
Back to questions
Senior
1

Задача с горутинами и счётчиком: будут ли гонки? Как исправить? Чем отличается Mutex от Atomic?

Companies where asked
Flant

Answer from 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)
}