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

У меня многопоточное приложение под Windows 7.

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

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

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

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

0

Решение

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

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

0

Другие решения

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

0