Sobes.tech
Junior — Middle

Vysvetlite, čo je semafor a ako sa používa na riadenie synchronizácie vlákien.

sobes.tech AI

Odpoveď od AI

Semafor je primitív synchronizácie, ktorý sa používa na riadenie prístupu ku spoločnému zdroju viacerými vláknami.

Obsahuje čítač, ktorý ukazuje, koľko vlákien môže súčasne získať prístup ku zdroju.

  • Ak je čítač väčší ako nula, vlákno môže vstúpiť a znížiť čítač o 1.
  • Ak je čítač rovný nule, vlákno je zablokované a čaká, kým iné vlákno neuvoľní zdroj.

V C# je semafor reprezentovaný triedami Semaphore alebo SemaphoreSlim.

Príklad použitia SemaphoreSlim:

using System;
using System.Threading;

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

    static void AccessResource(int id)
    {
        Console.WriteLine($"Vlákn {id} čaká na prístup");
        semaphore.Wait(); // žiadosť o prístup
        Console.WriteLine($"Vlákn {id}} získal prístup");

        Thread.Sleep(1000); // simulácia práce 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();
        }
    }
}

V tomto príklade môžu súčasne pracovať maximálne dve vlákna so zdrojom, ostatné čakajú na svoju radu.