Назад к вопросам
ВкусВилл
Senior
5
Какие примитивы синхронизации знаете?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В Go есть несколько основных примитивов синхронизации для управления конкурентным доступом к ресурсам:
- Mutex (sync.Mutex) — обеспечивает взаимное исключение, блокируя доступ к критической секции.
- RWMutex (sync.RWMutex) — расширенный мьютекс, позволяющий нескольким читателям одновременно читать, но блокирующий запись.
- WaitGroup (sync.WaitGroup) — позволяет ждать завершения группы горутин.
- Cond (sync.Cond) — условная переменная для уведомления горутин о наступлении события.
- Atomic операции (sync/atomic) — низкоуровневые операции для атомарного чтения и записи переменных.
Кроме того, в Go широко используются каналы (channels), которые позволяют синхронизировать горутины и передавать данные между ними без явного использования мьютексов.
Пример использования Mutex:
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
Пример использования WaitGroup:
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
// работа
}()
go func() {
defer wg.Done()
// работа
}()
wg.Wait()