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