Sobes.tech
Middle+

Кои примитиви за синхронизиране на горутините съществуват в Go?

sobes.tech AI

Отговор от 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)
}