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