Sobes.tech
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)
}