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)
}