Sobes.tech
Middle+

Τι είναι το primitive συγχρονισμού Semaphore;

sobes.tech AI

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

Semaphore — είναι ένα primitive συγχρονισμού που ελέγχει την πρόσβαση σε μια περιορισμένη ομάδα πόρων. Διατηρεί έναν μετρητή που καθορίζει πόσα νήματα μπορούν ταυτόχρονα να έχουν πρόσβαση στον πόρο.

Βασικές λειτουργίες:

  • WaitOneWaitAsync για ασύγχροχο κώδικα): Μειώνει τον μετρητή αν είναι μεγαλύτερος από το μηδέν. Αν ο μετρητής είναι μηδέν, το νήμα μπλοκάρεται μέχρι ο μετρητής να γίνει θετικός (ένα άλλο νήμα καλεί Release).
  • Release: Αυξάνει τον μετρητή και μπορεί να ξεμπλοκάρει το αναμονή νήμα.

Τύποι Semaphore:

  • Semaphore: Συστημικό (με ή χωρίς όνομα), μπορεί να χρησιμοποιηθεί μεταξύ διεργασιών.
  • SemaphoreSlim: Ελαφριά υλοποίηση, προορίζεται για χρήση εντός μιας διεργασίας. Προτιμάται για ενδο-διεργασιακό συγχρονισμό.

Παράδειγμα χρήσης του SemaphoreSlim:

// semaphoreSlim μπορεί να χρησιμοποιηθεί για τον περιορισμό της ταυτόχρονης πρόσβασης σε έναν πόρο
// Σε αυτήν την περίπτωση, επιτρέπονται 2 νήματα ταυτόχρονα
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Περιμένει την απελευθέρωση του σεμαφόρου
    await semaphoreSlim.WaitAsync();
    try
    {
        // Πρόσβαση σε περιορισμένο πόρο
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} πρόσβαση στον πόρο");
        await Task.Delay(1000); // Προσομοίωση εργασίας με τον πόρο
    }
    finally
    {
        // Απελευθερώνει το σεμαφόρο
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} απελευθέρωση πόρου");
        semaphoreSlim.Release();
    }
}