Ποια είναι η διαφορά μεταξύ mutex, semaphore και lock;
sobes.tech AI
Απάντηση από AI
Το lock στη C# είναι μια συντακτική ζάχαρη για τη χρήση των Monitor.Enter και Monitor.Exit, τυλιγμένων σε ένα μπλοκ try-finally για να διασφαλιστεί η απελευθέρωση του κλειδώματος. Παρέχει αποκλειστική πρόσβαση σε μια πόρο για ένα μόνο νήμα. Ουσιαστικά, είναι το πιο απλό primitive συγχρονισμού σε επίπεδο αντικειμένου.
Το Mutex είναι ένα primitive συγχρονισμού που μπορεί να χρησιμοποιηθεί για να παρέχει αποκλειστική πρόσβαση σε μια πόρο για ένα μόνο νήμα μεταξύ πολλαπλών διεργασιών. Έχει μια έννοια ιδιοκτησίας νήματος: μόνο το νήμα που έχει αποκτήσει το mutex μπορεί να το απελευθερώσει.
Το Semaphore είναι ένα primitive συγχρονισμού που περιορίζει τον αριθμό των νημάτων που μπορούν να έχουν πρόσβαση σε μια πόρο ταυτόχρονα. Έχει έναν μετρητή που μειώνεται κατά την απόκτηση πρόσβασης και αυξάνεται κατά την απελευθέρωση.
Οι βασικές διαφορές παρουσιάζονται στον πίνακα:
| Χαρακτηριστικό | lock (Monitor) |
Mutex |
Semaphore |
|---|---|---|---|
| Πεδίο ορατότητας | Μέσα σε μια διαδικασία | Μεταξύ διαδικασιών | Μεταξύ διαδικασιών |
| Αριθμός νημάτων | Μόνο ένα | Μόνο ένα (ιδιοκτήτης) | Περιορισμένος αριθμός |
| Ιδιοκτησία | Συνδεδεμένο με το νήμα | Συνδεδεμένο με το νήμα | Μη συνδεδεμένο με το νήμα |
| Χρήση | Απλός συγχρονισμός | Συγχρονισμός μεταξύ διαδικασιών, ονομασμένα mutexes | Περιορισμός παράλληλης πρόσβασης σε πόρο |
| Εξαιρέσεις | Δεν απαιτεί ρητή διαχείριση του AbandonedMutexException | Απαιτεί διαχείριση του AbandonedMutexException | Δεν υπάρχει AbandonedSemaphoreException |
// Παράδειγμα χρήσης lock
private readonly object _lockObject = new object();
public void DoSomethingWithLock()
{
lock (_lockObject)
{
// Κρίσιμη ενότητα
}
}
// Παράδειγμα χρήσης Mutex
using System.Threading;
private Mutex _mutex = new Mutex();
public void DoSomethingWithMutex()
{
_mutex.WaitOne(); // Απόκτηση mutex
try
{
// Κρίσιμη ενότητα
}
finally
{
_mutex.ReleaseMutex(); // Απελευθέρωση mutex
}
}
// Παράδειγμα χρήσης Semaphore
using System.Threading;
private Semaphore _semaphore = new Semaphore(3, 3); // Επιτρέπει 3 νήματα ταυτόχρονα
public void DoSomethingWithSemaphore()
{
_semaphore.WaitOne(); // Απόκτηση "πρόσβασης" στο semaphore
try
{
// Κρίσιμη ενότητα, περιορισμένη σε 3 νήματα
}
finally
{
_semaphore.Release(); // Απελευθέρωση "πρόσβασης"
}
}