2013-12-02 2 views
0

У меня многопоточное приложение под Windows 7.Почему потоки прерываются, даже если выполняется atexit или ConsoleHandler для SetConsoleCtrlhandler?

Мне нужно правильно закончить задания в потоках, которые имеют открытые дескрипторы, соединения и т. Д., Когда пользователь нажимает «X» в углу командной строки, «Ctrl + C ', выключает ОС и так далее.

Я установил обработчик для SetConsoleHandler, который устанавливает соответствующие флаги для других потоков, чтобы правильно завершить работу. Но все они прерываются, а y выходят с кодом 0xc000013a. У SOmetimes даже мой обработчик не успевает установить флаг.

Та же проблема остается, когда я пытаюсь выполнять те же операции в обработчике atexit.

Почему все потоки остановлены даже во время перерыва? Как я могу избежать этого и позволить всем моим потокам закончить работу?

+0

У вас есть 5 секунд, чтобы выполнить работу. Если это займет больше времени, вы будете выполняться в кратном порядке. Скорее всего, вероятность тупика всегда высока. –

+0

Я знаю о 5-секундном лимите, но прерывание происходит раньше. – flashnik

+0

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

ответ

0

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

0

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

Обычно это не достаточно. Вы также должны подождать, пока закончится нить (thread.join(), или WaitForMultipleObjects, или что-то подобное).

+0

Да, но все потоки (включая родительский) выход до присоединения завершаются. По моему мнению, присоединение к дочерним потокам включено в «отделочную работу». – flashnik

+0

@flashnik, Как вы его протестировали? Используете ли вы функции консоли IO (например, 'get')? Если да, попробуйте проверить возвращаемое значение из таких функций и «GetLastError». Для меня это похоже на то, что ваш основной поток выходит слишком быстро, поэтому ваш обработчик не имеет большого шанса быть выполненным. – qehgt

+0

Нет, основной поток прерывается при соединении потоков. Поток обработчика также прерывается. Так что кажется, что что-то еще просто прерывает всех :( – flashnik