Sobes.tech
Junior — Middle

Обяснете какво е семафор и как се използва за управление на синхронизацията на нишки.

sobes.tech AI

Отговор от AI

Семафорът е примитив за синхронизация, който се използва за управление на достъпа до споделен ресурс от няколко нишки.

Той съдържа брояч, който показва колко нишки могат едновременно да получат достъп до ресурса.

  • Ако броячът е по-голям от нула, нишката може да влезе и да намали брояча с 1.
  • Ако броячът е нула, нишката се блокира и чака, докато друга нишка освободи ресурса.

В C# семафорът е представен чрез класа Semaphore или SemaphoreSlim.

Пример за използване на SemaphoreSlim:

using System;
using System.Threading;

class Program
{
    static SemaphoreSlim semaphore = new SemaphoreSlim(2); // максимум 2 нишки едновременно

    static void AccessResource(int id)
    {
        Console.WriteLine($"Нишка {id} очаква достъп");
        semaphore.Wait(); // заявка за достъп
        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();
        }
    }
}

В този пример, не повече от две нишки могат да работят с ресурса едновременно, останалите чакат реда си.