Sobes.tech
Middle+

რა primitives არსებობს Go-ში goroutine-ების სინქრონიზაციისთვის?

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