Sobes.tech
Junior — Middle

Μπορείτε να εξηγήσετε τι είναι ένας σημαφόρος και πώς χρησιμοποιείται για τον έλεγχο πρόσβασης στους πόρους;

sobes.tech AI

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

Ένα semaphore είναι ένας μηχανισμός συγχρονισμού που χρησιμοποιείται για τον έλεγχο της πρόσβασης σε έναν κοινόχρηστο πόρο σε εφαρμογές πολλαπλών νημάτων. Περιέχει έναν μετρητή που δείχνει πόσα νήματα μπορούν ταυτόχρονα να έχουν πρόσβαση στον πόρο.

Αρχή λειτουργίας:

  • Αρχικά, ο μετρητής ρυθμίζεται στον αριθμό των διαθέσιμων πόρων (π.χ., 3).
  • Όταν ένα νήμα θέλει να αποκτήσει πρόσβαση, καλεί τη λειτουργία WaitWaitOne στα C#), η οποία μειώνει τον μετρητή κατά 1.
  • Αν ο μετρητής γίνει μικρότερος από το μηδέν, το νήμα μπλοκάρεται και περιμένει μέχρι ο πόρος να ελευθερωθεί.
  • Όταν ένα νήμα ελευθερώνει τον πόρο, καλεί το Release, αυξάνοντας τον μετρητή και ξεμπλοκάροντας τα αναμονή νήματα.

Παράδειγμα σε C#:

using System;
using System.Threading;

class Program
{
    static Semaphore semaphore = new Semaphore(3, 3); // μέγιστο 3 νήματα ταυτόχρονα

    static void AccessResource(int id)
    {
        Console.WriteLine($"Νήμα {id} περιμένει πρόσβαση");
        semaphore.WaitOne(); // αίτημα πρόσβασης
        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();
        }
    }
}

Με αυτόν τον τρόπο, το semaphore περιορίζει τον αριθμό των νήματων που εργάζονται ταυτόχρονα με τον πόρο, αποτρέποντας συνθήκες αγώνα και διασφαλίζοντας σωστή λειτουργία.