Sobes.tech
Middle

Ποια είναι η διαφορά μεταξύ 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(); // Απελευθέρωση "πρόσβασης"
    }
}