2016-03-11 3 views
1

Там не было никакого прямого и удовлетворительный ответ нашел на довольно простой вопрос:Ожидание нитей закончить в то время как выход из процесса

Учитывая несколько потоков, выполняющихся существует ли общий/правильный способ ждать на них, чтобы закончить при выходе процесс? Или «делает приуроченное ожидание. Хорошо в этом случае?»

Да, мы пытаемся сигнализировать о завершении резьбы, но наблюдается, что во время выхода процесса некоторые из них склонны к остановке. Недавно мы имели обсуждение и было принято решение избавиться от «произвольного ожидания»:

m_thread.quit();   // the way we had threads finished 
m_thread.wait(kWaitMs); // with some significant expiration (~1000ms) 

m_thread.quit();   // the way we have threads finished now 
m_thread.wait();   // wait forever until finished 

Я понимаю, что постоянная kWaitMs следует выбирать несколько пропорционально одной непрерывной «работы цикла» для потока, чтобы закончить. Скажем, если поток обрабатывает некоторый фрагмент данных за 10 мс, то нам, вероятно, следует подождать, пока он ответит на сигнал выхода за 100 мс, и если он все равно не уйдет, мы просто больше не будем ждать. Мы не будем ждать в этом случае, пока мы выходим из программы и больше не заботимся. Но некоторые инженеры не понимают такую ​​«парадигму» и хотят окончательного ожидания. Имейте в виду, что программный процесс, застрявший в памяти на клиентском компьютере, вызовет проблемы при запуске следующей программы в нашем случае, не говоря уже о том, что журнал не будет правильно завершен для обработки в качестве ошибки.

Можно ли ответить на вопрос о правильной обработке резьбы при завершении процесса?

Есть ли какая-то помощь от Qt/APIs, чтобы лучше разрешить зависание нити, поэтому мы можем записать причину этого?

P.S. Имейте в виду, что я well aware о том, почему это неправильно, чтобы принудительно завершить поток и как это можно сделать. Этот вопрос, я думаю, касается не синхронизации, а ограниченного детерминизма потоков, которые управляют тоннами нашего и фреймворка и кода ОС. ОС не в режиме реального времени, право: Windows/MacOS/Linux и т. Д.

P.P.S. Все эти темы имеют цикл событий, поэтому должен ответить на QThread::quit().

+0

Итак, вы спрашиваете, как убедиться, что поток правильно отвечает на событие «выйти»?Или вы спрашиваете, как определить, почему поток не ушел правильно? Я не уверен, что понимаю, что вы подразумеваете под «ограниченным детерминизмом». Вы имеете в виду «Удостовериться, что он не может работать очень долго»? –

+0

Главный вопрос: выполняется ли время ожидания Ok в этом случае? И все связанное обсуждение, включая диагностику, почему он не уходит. – AlexanderVX

ответ

2

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

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

Если вы этого не сделаете/не можете, тогда нет возможности надежно отключить ваше приложение, потому что вы не можете безопасно освобождать ресурсы, к которым по-прежнему может обращаться поток. Необходимо, чтобы 100% гарантировали, что поток вышел до того, как основной поток вызывает деструкторы любых объектов, которые использует поток (например, объект QThread, связанный с потоком)

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

+0

Кстати, когда вы сталкиваетесь с потоком, который застопорился во время последовательности выключения, было бы неплохо использовать отладчик или что-то вроде функции «Sample Process» монитора активности Apple, выяснить, где находится текущая точка выполнения потока (т. е. трассировка стека в месте, где она застряла). Как только вы знаете, где застряла нить, вы будете хорошо на пути к выяснению, почему она застряла, и выясните, как ее отклеить. –

+0

Я не могу не согласиться с вами по нахождению причины таких неприятностей, но когда это происходит «на сайте», это слишком поздно. Возможно, имеет смысл иметь отладочный код, не смотрящий период истечения срока действия, все еще имея бесконечное ожидание кода выпуска. – AlexanderVX

+0

Согласовано, «на месте» слишком поздно - это означает, что проблема должна быть воспроизведена «вне сайта» и зафиксирована до этого, если это возможно. –

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