Расскажите про работу с атомиками и мьютексами.
Ответ от нейросети
sobes.tech AI
В Go атомарные операции и мьютексы используются для синхронизации доступа к общим ресурсам в конкурентной среде.
Атомики (пакет sync/atomic) позволяют выполнять низкоуровневые операции над переменными (например, инкремент, сравнение и обмен) без блокировок. Они эффективны для простых случаев, когда нужно гарантировать атомарность изменения значения.
Пример атомарного инкремента:
import (
"sync/atomic"
"fmt"
)
var counter int64
func increment() {
atomic.AddInt64(&counter, 1)
}
Мьютексы (пакет sync) — это более общий механизм блокировок, который позволяет защитить критические секции кода. Мьютекс блокирует доступ к ресурсу, пока он не будет освобожден, что предотвращает гонки при сложных операциях.
Пример использования мьютекса:
import (
"sync"
)
var mu sync.Mutex
var sharedResource int
func safeIncrement() {
mu.Lock()
sharedResource++
mu.Unlock()
}
В общем, атомики подходят для простых операций с примитивными типами, а мьютексы — для более сложных критических секций и структур данных.