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