Sobes.tech
Back to questions
Junior — Middle
66

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

Companies where asked
Почтатех
TVision
OZONOZON

Answer from AI

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

Таким образом, семафор ограничивает количество потоков, одновременно работающих с ресурсом, предотвращая гонки и обеспечивая корректность работы.