Sobes.tech
Junior — Middle

Εξηγήστε τη λειτουργία του μηχανισμού συγχρονισμού των goroutines στο πλαίσιο της ανταγωνιστικής εκτέλεσης εργασιών.

sobes.tech AI

Απάντηση από AI

Στο Go, οι goroutines είναι ελαφριά νήματα που εκτελούνται ταυτόχρονα. Για τον συγχρονισμό των goroutines, χρησιμοποιούνται μηχανισμοί που συντονίζουν την πρόσβαση σε κοινόχρηστους πόρους και οργανώνουν την εκτέλεση.

Κύριοι μηχανισμοί συγχρονισμού:

  • Κανάλια (channels): επιτρέπουν τη μεταφορά δεδομένων μεταξύ goroutines, διασφαλίζοντας τον συγχρονισμό μέσω ανταλλαγής μηνυμάτων.
  • Mutex (sync.Mutex): μπλοκάρει την πρόσβαση σε κοινά δεδομένα για την αποφυγή συνθηκών αγώνα.
  • WaitGroup (sync.WaitGroup): επιτρέπει την αναμονή για την ολοκλήρωση μιας ομάδας goroutines.

Παράδειγμα με κανάλι:

package main

import (
    "fmt"
)

func worker(ch chan int) {
    val := <-ch // περιμένει δεδομένα από το κανάλι
    fmt.Println("Ληφθείσα τιμή:", val)
}

func main() {
    ch := make(chan int)
    go worker(ch)
    ch <- 42 // στέλνει δεδομένα στο κανάλι
}

Εδώ, το κανάλι διασφαλίζει τον συγχρονισμό: η goroutine worker περιμένει μέχρι το main να στείλει μια τιμή.