Sobes.tech
Junior — Middle

Môžete vysvetliť, čo je semafor a ako sa používa na riadenie prístupu k zdrojom?

sobes.tech AI

Odpoveď od AI

Semafor je mechanizmus synchronizácie, ktorý sa používa na kontrolu prístupu ku zdieľanému zdroju v viacvláknových aplikáciách. Obsahuje čítač, ktorý ukazuje, koľko vlákien môže súčasne získať prístup ku zdroju.

Princíp fungovania:

  • Na začiatku je čítač nastavený na počet dostupných zdrojov (napríklad 3).
  • Keď vlákno chce získať prístup, volá operáciu Wait (alebo WaitOne v C#), ktorá znižuje čítač o 1.
  • Ak sa čítač stane menší ako nula, vlákno je zablokované a čaká, kým sa zdroj neuvoľní.
  • Keď vlákno uvoľní zdroj, volá Release, zvyšuje čítač a odblokuje čakajúce vlákna.

Príklad v C#:

using System;
using System.Threading;

class Program
{
    static Semaphore semaphore = new Semaphore(3, 3); // maximálne 3 vlákna súčasne

    static void AccessResource(int id)
    {
        Console.WriteLine($"Vlákn {id} čaká na prístup");
        semaphore.WaitOne(); // žiadosť o prístup
        Console.WriteLine($"Vlákn {id} získal prístup");
        Thread.Sleep(1000); // práca s zdrojom
        Console.WriteLine($"Vlákn {id} uvoľňuje zdroj");
        semaphore.Release(); // uvoľnenie zdroja
    }

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

Týmto spôsobom semafor obmedzuje počet vlákien pracujúcich súčasne so zdrojom, zabraňuje súťažiam a zabezpečuje správnu funkčnosť.