Sobes.tech
Junior — Middle

Έχετε εμπειρία με αδιέξοδα (Deadlock) κατά την εργασία με πολυνηματικότητα;

sobes.tech AI

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

Ναι, έχω εμπειρία με αμοιβαίο μπλοκάρισμα (deadlock) σε πολυνηματικά προγράμματα. Ένα deadlock συμβαίνει όταν δύο ή περισσότεροι νήματα περιμένουν αέναα την απελευθέρωση πόρων που κατέχουν άλλα, οδηγώντας σε παύση.

Για παράδειγμα, αν το νήμα A έχει καταλάβει πόρο 1 και περιμένει πόρο 2, και το νήμα B έχει καταλάβει πόρο 2 και περιμένει πόρο 1, δημιουργείται deadlock.

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

  • Πάντα να αποκτάτε τους πόρους με την ίδια σειρά.
  • Να χρησιμοποιείτε timeouts ή context με ακύρωση.
  • Να ελαχιστοποιείτε το χρόνο διατήρησης των κλειδώσεων.

Παράδειγμα πιθανής deadlock με mutex:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Second)
    mu2.Lock()
    defer mu2.Unlock()
    // εργασία
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Second)
    mu1.Lock()
    defer mu1.Unlock()
    // εργασία
}

Εδώ, τα f1 και f2 μπορούν να μπλοκάρουν το ένα το άλλο αν κληθούν ταυτόχρονα.