Junior — Middle
Εξηγήστε τι είναι ένας σημαφόρος και πώς χρησιμοποιείται για τον έλεγχο της συγχρονισμού νημάτων.
sobes.tech AI
Απάντηση από AI
Ο σημαφόρος είναι μια primitive συγχρονισμού που χρησιμοποιείται για τον έλεγχο της πρόσβασης σε μια κοινόχρηστη πόρο από πολλαπλά νήματα.
Περιέχει έναν μετρητή που δείχνει πόσα νήματα μπορούν ταυτόχρονα να έχουν πρόσβαση στην πόρο.
- Αν ο μετρητής είναι μεγαλύτερος από το μηδέν, το νήμα μπορεί να εισέλθει και να μειώσει τον μετρητή κατά 1.
- Αν ο μετρητής είναι μηδέν, το νήμα μπλοκάρεται και περιμένει μέχρι ένα άλλο νήμα να ελευθερώσει την πόρο.
Στη C#, ο σημαφόρος εκπροσωπείται από την κλάση Semaphore ή SemaphoreSlim.
Παράδειγμα χρήσης του SemaphoreSlim:
using System;
using System.Threading;
class Program
{
static SemaphoreSlim semaphore = new SemaphoreSlim(2); // μέγιστο 2 νήματα ταυτόχρονα
static void AccessResource(int id)
{
Console.WriteLine($"Νήμα {id} περιμένει πρόσβαση");
semaphore.Wait(); // αίτημα πρόσβασης
Console.WriteLine($"Νήμα {id}} πήρε πρόσβαση");
Thread.Sleep(1000); // προσομοίωση εργασίας με την πόρο
Console.WriteLine($"Νήμα {id}} ελευθερώνει την πόρο");
semaphore.Release(); // απελευθέρωση πόρου
}
static void Main()
{
for (int i = 1; i <= 5; i++)
{
int localId = i;
new Thread(() => AccessResource(localId)).Start();
}
}
}
Σε αυτό το παράδειγμα, το πολύ δύο νήματα μπορούν να εργάζονται ταυτόχρονα με την πόρο, τα υπόλοιπα περιμένουν τη σειρά τους.