Sobes.tech
Senior

Vor fi curse în o sarcină cu goroutines și un contor? Cum se corectează? Care este diferența dintre Mutex și Atomic?

sobes.tech AI

Răspuns de la 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)
}