Sobes.tech
Junior — Middle
117

Объясните, что такое семафор и как он используется для управления синхронизацией потоков

Компании, где спрашивали
Почтатех

Ответ от нейросети

sobes.tech 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();
        }
    }
}

В этом примере одновременно не более двух потоков могут работать с ресурсом, остальные ждут своей очереди.