Как обнаружить зависшую нить? - PullRequest
0 голосов
/ 15 апреля 2009

Можно ли обнаружить зависшую нить? Этот поток не является частью какого-либо пула потоков, это просто системный поток. Поскольку поток завис, он не может обрабатывать события.

Спасибо

Ответы [ 3 ]

3 голосов
/ 15 апреля 2009

Теоретически невозможно . Если вы работаете в Windows и подозреваете, что поток может быть заблокирован, я думаю, вы могли бы использовать GetThreadContext несколько раз и проверить, всегда ли он одинаков, но я не знаю, насколько надежным он будет.

1 голос
/ 15 апреля 2009

Не в теории, но на практике это может быть возможно, в зависимости от вашей рабочей нагрузки. Например, если он должен отвечать на события, вы можете опубликовать сообщение потока (в окнах) и посмотреть, отвечает ли он. Вы можете установить событие или флаг, который заставит его что-то сделать - вам придется ждать «разумного» времени, чтобы увидеть, ответил ли он. Тогда возникает вопрос, что бы вы сделали с «зависшим» потоком, даже если он действительно завис и не занимает много времени, чтобы ответить. Обычно поток не может быть безопасно уничтожен, и вы не можете прерывать произвольный поток. Это достаточно безопасно, чтобы записать сообщение об этом, но кого это волнует? Вероятно, лучшее, что нужно сделать, это заметить это и выяснить, какая ошибка вызывает его зависание.

0 голосов
/ 15 апреля 2009

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

Нам нужно гораздо больше информации, прежде чем мы сможем дать конкретный ответ на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...