Sobes.tech
Junior — Middle

Можете ли да обясните какво е семафор и как се използва за контрол на достъпа до ресурси?

sobes.tech AI

Отговор от AI

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

Принцип на работа:

  • Първоначално броячът се настройва на броя на наличните ресурси (например 3).
  • Когато нишка иска да получи достъп, тя извиква операцията Wait (или WaitOne в C#), която намалява брояча с 1.
  • Ако броячът стане по-малък от нула, нишката се блокира и чака, докато ресурсът не бъде освободен.
  • Когато нишка освобождава ресурса, тя извиква Release, увеличавайки брояча и отключвайки чакащите нишки.

Пример в C#:

using System;
using System.Threading;

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

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

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