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.