Middle+
Τι είναι το primitive συγχρονισμού Semaphore;
sobes.tech AI
Απάντηση από AI
Semaphore — είναι ένα primitive συγχρονισμού που ελέγχει την πρόσβαση σε μια περιορισμένη ομάδα πόρων. Διατηρεί έναν μετρητή που καθορίζει πόσα νήματα μπορούν ταυτόχρονα να έχουν πρόσβαση στον πόρο.
Βασικές λειτουργίες:
WaitOne(ήWaitAsyncγια ασύγχροχο κώδικα): Μειώνει τον μετρητή αν είναι μεγαλύτερος από το μηδέν. Αν ο μετρητής είναι μηδέν, το νήμα μπλοκάρεται μέχρι ο μετρητής να γίνει θετικός (ένα άλλο νήμα καλεί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();
}
}