У меня многопоточное приложение под Windows 7.
Мне нужно правильно завершать задания в потоках с открытыми дескрипторами, соединениями и т. Д., Когда пользователь нажимает «X» в углу командной строки, «Ctrl + C», выключает ОС и т. Д.
Я установил обработчик для SetConsoleHandler, который устанавливает соответствующие флаги для других потоков, чтобы правильно завершить свою работу. Но все они прерываются и выход y с кодом 0xc000013a. Иногда даже мой обработчик не успевает установить флаг.
Та же проблема остается, когда я пытаюсь сделать те же операции в обработчике atexit.
Почему все потоки останавливаются даже во время обработки прерывания? Как я могу избежать этого и позволить всем моим темам закончить свою работу?
устанавливает соответствующие флаги для других потоков, чтобы правильно завершить свою работу
Обычно этого недостаточно. Вы также должны ждать окончания потоков (thread.join()
, или же WaitForMultipleObjects
или что-то подобное).
Проблема в моем случае заключалась в том, что некоторые из дочерних потоков использовали время ожидания системных ресурсов, поэтому каждый из них должен был проснуться от ожидания присоединения к потоку. И все они останавливались последовательно, поэтому им требовалось слишком много времени, чтобы остановиться.