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