Я использую простое блокирование в C# с помощью инструкции lock
. Есть ли способ определить, сколько других потоков ожидает, чтобы получить блокировку объекта? Я в основном хочу ограничить количество потоков, ожидающих блокировки до 5. Мой код будет генерировать исключение, если шестой поток должен получить блокировку.Есть ли способ определить количество потоков, ожидающих блокировки на C#?
ответ
Это можно легко выполнить с помощью класса Semaphore
. Он будет делать подсчет для вас. Обратите внимание, что в приведенном ниже коде я использую семафор, чтобы выполнить неблокирующую проверку количества потоков, ожидающих ресурса, а затем я использую простой старый lock
для фактического сериализации доступа к этому ресурсу. Исключение выдается, если на ресурс присутствует более 5 потоков.
public class YourResourceExecutor
{
private Semaphore m_Semaphore = new Semaphore(5, 5);
public void Execute()
{
bool acquired = false;
try
{
acquired = m_Semaphore.WaitOne(0);
if (!acquired)
{
throw new InvalidOperationException();
}
lock (m_Semaphore)
{
// Use the resource here.
}
}
finally
{
if (acquired) m_Semaphore.Release();
}
}
}
Существует один заметный вариант этого рисунка. Вы можете изменить имя метода на TryExecute
и вернуть его bool
вместо того, чтобы выбрасывать исключение. Это полностью зависит от вас.
Помните, что объектом, используемым в выражении блокировки, является не объект блокировки. Он просто служит идентификатором для синхронизированного блока кода. Любые кодовые блоки, которые приобретают блокировки, используя , тот же объект будет эффективно сериализован. Это блокировка кода, а не объект, используемый в выражении lock
.
Вы можете использовать простой общий счетчик (целое число), который увеличивается до инструкции блокировки. Если значение равно 5, то ваш поток избегает оператора блокировки. Однако проблема состоит в том, что вам нужно будет заблокировать счетчик, чтобы гарантировать, что операция увеличения является атомарной.
Нет, lock()
использует Monitor class и не имеет учетной записи, чтобы узнать о nr в очереди.
Вы можете указать тайм-аут.
И, откровенно говоря, бросать исключение, когда очередь заполняется, звучит как плохая идея.
Заявление о блокировке является ярлыком для Monitor.Enter и Monitor.Exit
. Я не думаю, что у вас есть шанс получить количество ожидающих объектов.
- 1. NSLock, количество потоков, ожидающих
- 2. Есть ли способ динамически определить количество потоков cuda?
- 3. Самый дешевый способ разбудить несколько ожидающих потоков без блокировки
- 4. получить количество потоков, ожидающих un mutex
- 5. Как получить количество потоков, ожидающих входа в замок?
- 6. Обнаружение ожидающих потоков в C Pthread
- 7. Сигнализация для потоков, ожидающих блокировки, что блокировка стала неактуальной
- 8. Есть ли способ надежно определить общее количество ядер процессора?
- 9. Java лучший способ определить оптимальное количество потоков
- 10. Выполнение всех ожидающих потоков
- 11. Можно ли вызвать notifyAll() для потоков, ожидающих определенной блокировки на Java?
- 12. pthread_join - несколько потоков, ожидающих
- 13. Несколько потоков, ожидающих одного события?
- 14. Как определить количество пространственных потоков
- 15. Есть ли способ контролировать количество потоков, используемых с pmap?
- 16. Как определить оптимальное количество потоков?
- 17. Заблокирует ли создание нагромождения потоков?/Это правильный способ избежать блокировки
- 18. Как определить количество аппаратных потоков
- 19. Есть ли какой-либо безопасный способ получить количество задач, ожидающих в настоящее время при завершении?
- 20. Каков наилучший способ определить количество потоков для запуска в машине с n ядрами? (C++)
- 21. Можете ли вы определить, сколько потоков задает определенное количество горутов?
- 22. Для многих потоков, ожидающих на семафоре
- 23. C#, приоритеты потоков и блокировки
- 24. Несколько потоков, ожидающих на том же мероприятии обращаться в C++
- 25. Есть ли способ определить количество бесплатной видеопамяти в Linux?
- 26. Есть ли простой способ получить количество символов, напечатанных на C++?
- 27. C# Максимальное количество потоков
- 28. Обнаружение блокировки потоков erlang
- 29. Есть ли способ определить, заблокирован ли объект?
- 30. Остановка ожидающих потоков при условии
Это звучит как вторая половина громоздкого решения. Какова проблема, которую вы пытаетесь решить? – 2010-12-15 21:25:49
Болезненно объяснить, но у меня есть объект, который является оберткой стороннего веб-сервиса. Хитрость заключается в том, что вызовы сторонней службы должны быть синхронизированы, следовательно, блокировка объекта-обертки. Я использую объект-оболочку в среде веб-сайта, поэтому несколько потоков могут попытаться использовать его одновременно. Причина, по которой я хочу ограничить очередь ожидающих потоков до 5, заключается в том, что я немного обеспокоен тем, насколько легко было бы создать DoS-приложение. Сторонний веб-сервис работает очень медленно, поэтому кто-то может легко отправлять запросы, и у меня будет 100% заблокированных потоков. – 2010-12-15 21:34:57
@Ben: Похоже, ресурс, который вам нужно ограничить, - это количество потоков в системе *, а не * сколько можно ждать при блокировке *. Никогда не делайте нить за запрос; сделать один поток на один процессор, и если у вас закончились процессоры, попросите клиента подождать, пока поток освободится. – 2010-12-15 21:43:20