Sobes.tech
Middle+
112
questionbank

Что такое примитив синхронизации Semaphore?

Answer from AI

sobes.tech AI

Semaphore — это примитив синхронизации, который управляет доступом к ограниченному пулу ресурсов. Он поддерживает счетчик, который определяет количество потоков, которые могут одновременно получить доступ к ресурсу.

Основные операции:

  • WaitOne (или WaitAsync для асинхронного кода): Уменьшает счетчик, если он больше нуля. Если счетчик равен нулю, поток блокируется до тех пор, пока счетчик не станет положительным (другой поток вызовет Release).
  • Release: У увеличивает счетчик и может разблокировать ожидающий поток.

Типы Semaphore:

  • Semaphore: Системный (именованный или безымянный), может использоваться между процессами.
  • SemaphoreSlim: Легковесная реализация, предназначенная для использования внутри процесса. Предпочтительнее для внутрипроцессной синхронизации.

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

// semaphoreSlim может быть использован для ограничения одновременного доступа к ресурсу
// В данном случае разрешено 2 потока одновременно
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Ожидает освобождения семафора
    await semaphoreSlim.WaitAsync();
    try
    {
        // Доступ к ограниченному ресурсу
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} accessing resource");
        await Task.Delay(1000); // Имитация работы с ресурсом
    }
    finally
    {
        // Освобождает семафор
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} releasing resource");
        semaphoreSlim.Release();
    }
}