Back to questions
СБЕР
Middle+
4
Какие примитивы синхронизации горутин существуют в Go?
Companies where asked
Answer from AI
sobes.tech AI
В Go для синхронизации горутин используются следующие основные примитивы:
- Mutex (sync.Mutex) — обеспечивает взаимное исключение, блокируя доступ к разделяемым ресурсам.
- RWMutex (sync.RWMutex) — расширение Mutex, позволяющее нескольким горутинам читать одновременно, но блокирует запись.
- WaitGroup (sync.WaitGroup) — позволяет ждать завершения набора горутин.
- Channel (chan) — канал для передачи данных между горутинами, обеспечивает синхронизацию через передачу сообщений.
- Once (sync.Once) — гарантирует, что определённая функция выполнится только один раз.
- Cond (sync.Cond) — условная переменная для более сложной синхронизации, например, ожидания определённого состояния.
Пример использования WaitGroup и Mutex:
var mu sync.Mutex
var wg sync.WaitGroup
var counter int
func increment() {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}
func main() {
wg.Add(3)
go increment()
go increment()
go increment()
wg.Wait()
fmt.Println("Counter:", counter)
}