Junior — Middle
Ποια μέθοδος επιτρέπει την αποτροπή αμοιβαίου αποκλεισμού κατά τη χρήση mutex μέσα σε μια λειτουργία;
sobes.tech AI
Απάντηση από AI
Για να αποτρέψετε το αδιέξοδο (deadlock) κατά τη χρήση mutex μέσα σε μια ίδια λειτουργία στο Go, μπορείτε να χρησιμοποιήσετε τις ακόλουθες μεθόδους:
- Αποφύγετε την επανεκχώρηση του ίδιου mutex: αν το mutex είναι ήδη κλειδωμένο, μην προσπαθείτε να το κλειδώσετε ξανά στον ίδιο νήμα.
- Χρησιμοποιήστε
sync.RWMutexαντί γιαsync.Mutex, αν μόνο διαβάζονται δεδομένα, για να μειώσετε τα μπλοκαρίσματα. - Οργανώστε τον κώδικα έτσι ώστε η απόκτηση mutex να γίνεται με την ίδια σειρά, αν αποκτούνται πολλά mutex.
- Χρησιμοποιήστε
TryLock(μέσω εξωτερικών βιβλιοθηκών ή δικής σας υλοποίησης), για να προσπαθήσετε να αποκτήσετε το mutex χωρίς να μπλοκάρετε, και να διαχειριστείτε την κατάσταση σε περίπτωση αποτυχίας.
Παράδειγμα ασφαλούς χρήσης mutex:
var mu sync.Mutex
func safeFunction() {
mu.Lock()
defer mu.Unlock()
// κρίσιμη ενότητα
}
Είναι σημαντικό να μην καλείτε mu.Lock() ξανά στην ίδια goroutine χωρίς Unlock(), διαφορετικά μπορεί να προκύψει deadlock.