Sobes.tech
Junior — Middle

Můžete vysvětlit, co je semafor a jak se používá k řízení přístupu k prostředkům?

sobes.tech AI

Odpověď od AI

Semafor je synchronizační mechanismus používaný k řízení přístupu ke sdílenému zdroji v vícevláknových aplikacích. Obsahuje čítač, který ukazuje, kolik vláken může současně přistupovat ke zdroji.

Princip fungování:

  • Na začátku je čítač nastaven na počet dostupných zdrojů (například 3).
  • Když vlákno chce získat přístup, volá operaci Wait (nebo WaitOne v C#), která snižuje čítač o 1.
  • Pokud se čítač stane menší než nula, vlákno je zablokováno a čeká, dokud není zdroj uvolněn.
  • Když vlákno uvolní zdroj, volá Release, čítač zvyšuje a odemyká čekající vlákna.

Příklad v C#:

using System;
using System.Threading;

class Program
{
    static Semaphore semaphore = new Semaphore(3, 3); // maximálně 3 vlákna současně

    static void AccessResource(int id)
    {
        Console.WriteLine($"Vlákno {id} čeká na přístup");
        semaphore.WaitOne(); // žádost o přístup
        Console.WriteLine($"Vlákno {id} získalo přístup");
        Thread.Sleep(1000); // práce s zdrojem
        Console.WriteLine($"Vlákno {id} uvolňuje zdroj");
        semaphore.Release(); // uvolnění zdroje
    }

    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            int localId = i;
            new Thread(() => AccessResource(localId)).Start();
        }
    }
}

Tímto způsobem semafor omezuje počet vláken pracujících současně se zdrojem, předchází závodním podmínkám a zajišťuje správnou funkčnost.