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();
}
}
}
В этом примере одновременно не более двух потоков могут работать с ресурсом, остальные ждут своей очереди.