Sobes.tech
Middle+

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

sobes.tech AI

Отговор от 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} достъпва ресурс");
        await Task.Delay(1000); // Симулация на работа с ресурса
    }
    finally
    {
        // Освобождава семафора
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} освобождава ресурс");
        semaphoreSlim.Release();
    }
}