2010-12-14 3 views
2

У меня очередь задач для ThreadPool, и каждая задача имеет тенденцию затормозить блокировку всех ресурсов, которые она использует. И они не могут быть освобождены, если служба не перезапущена.Как узнать, что поток в пуле потоков зависает/зависает

Есть ли способ в ThreadPool узнать, что его поток уже заморожен? У меня есть идея использовать тайм-аут (хотя я до сих пор не знаю, как его написать), но я считаю, что он небезопасен, потому что время обработки не является равномерным.

+2

Что вы планируете делать, когда знаете, что нить заморожена? Убей это? Это может привести к тому, что структуры данных будут использоваться потоком в несогласованном состоянии. Вам лучше найти источник тупика и зафиксировать его. – cdhowie

+0

Да, мне нужно убить его. Его «огонь и забыть» тип нити, поэтому я думаю, что нет никакого вреда, если его убили. –

+1

«Я думаю, что нет никакого вреда, если его убили» - Знаменитые последние слова ... –

ответ

3

Я не хочу быть слишком самонадеянным здесь, но хорошая доза фактически выясняет, в чем проблема, и фиксирует это лучший курс с взаимоблокировками.

  • Запустите отладочную версию вашего сервиса и дождитесь его блокировки.Он будет оставаться в тупике, поскольку это прекрасное свойство тупиков.
  • Прикрепите отладчик Visual Studio к службе.
  • "Break All".
  • Воспитывайте свои нити окно и начать спелеологию ...

Если у вас нет звуковой архитектуры \ дизайн \ причины выбора жертв в первую очередь, не делает это - период. Это в значительной степени рецепт катастрофы, чтобы произвольно обманывать потоки над головой, когда они находятся в середине чего-то.

+1

Это не слишком самонадеянно. Правильный ответ на вопрос «Как мне снова прикрепить голову к моему телу после того, как я отключил его?» на самом деле «Не обрезайте его в первую очередь, я гусь!» :-) – paxdiablo

+1

@paxdiablo Я стремился не наметить какой-либо алгоритм обнаружения тупика, поскольку это потребует какой-то безопасности потоков для реализации, и, ну, вы знаете. Борьба с огнем с бензином :) –

1

Один из способов - использовать сторожевой таймер (решение, обычно выполняемое в аппаратных средствах, но применимое и к программному обеспечению).

В каждом потоке задано значение, соответствующее потоку, по меньшей мере один раз каждые пять секунд (например).

Затем ваш сторожевой таймер просыпается каждые десять секунд (опять же, это только пример) и проверяет, чтобы все значения равны 1. Если они не 1, тогда поток заблокирован.

Контрольный таймер затем устанавливает их все в 0 и возвращается к следующему циклу.

Предоставление рабочих потоков написано таким образом, чтобы они могли своевременно устанавливать значения в незамерзающих условиях, эта схема будет работать нормально.

Первый поток, который блокирует, не установит его значение в 1, и это будет обнаружено сторожевым таймером в следующем цикле.


Однако лучше раствор, чтобы выяснить, почему потоки замерзают в первую очередь, и исправить это.

2

(Это, пожалуй, немного низкоуровневое, но, по крайней мере, это простое решение. Поскольку я не знаю, C# 's API, это общее решение для любого языка с использованием нитей-пулов.)

Вставьте задачу watchdog после каждой реальной задачи, которая обновляет значение времени с текущим временем. Если это значение больше, чем максимальное время выполнения задачи (скажем, 10 секунд), вы знаете, что что-то застряло.

Вместо того, чтобы устанавливать время и опросить его, вы можете непрерывно устанавливать и перезагружать некоторые таймеры на 10 секунд в будущее. Когда он срабатывает, задача зависла.

Лучший способ, вероятно, состоит в том, чтобы обернуть каждую задачу в класс задач «Сторожевой», который делает это автоматически. Таким образом, после завершения, вы очистите таймер, и вы также можете установить тайм-аут на одну задачу, что может быть полезно.

Для каждого потока в потоковом потоке вам нужен один объект времени/таймера, но это разрешимо через локальные переменные потока.

Обратите внимание, что это решение не требует изменения кода вашей задачи. Он только изменяет задачи ввода кода в пул.

Смежные вопросы