Senior
Кои примитиви за синхронизация знаете?
sobes.tech AI
Отговор от AI
В Go има няколко основни примитива за синхронизация за управление на конкурентен достъп до ресурси:
- Mutex (sync.Mutex) — осигурява взаимно изключване, блокирайки достъпа до критичната секция.
- RWMutex (sync.RWMutex) — разширен mutex, който позволява на няколко читатели да четат едновременно, но блокира писането.
- WaitGroup (sync.WaitGroup) — позволява да се изчака завършването на група горутини.
- Cond (sync.Cond) — условна променлива за уведомяване на горутините за настъпване на събитие.
- Атомарни операции (sync/atomic) — ниско ниво операции за атомично четене и писане на променливи.
Освен това, в Go широко се използват канали (channels), които позволяват синхронизиране на горутините и предаване на данни между тях без явна употреба на mutex-и.
Пример за използване на 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()