Вызов TerminateThread в потоке Windows при выходе из приложения

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

Мой вопрос в том, могу ли я вызвать TerminateThread прямо перед закрытием приложения. Есть 100% гарантия, что приложение закроется в тот же момент. Рискую ли я получить утечку памяти в этом случае? Или что-то, что должно помешать мне вызвать этот API в этой конкретной ситуации?

PS. Я хочу вызвать его, чтобы приложение быстрее закрывалось. Это слишком долго объяснять, но мне нужно, чтобы это приложение закрылось как можно скорее при определенном условии. (Приложение представляет собой заставку и должно закрываться, как только пользователь перемещает мышь.)


person ahmd0    schedule 31.10.2011    source источник
comment
Очевидно, что ваше приложение не завершится корректно, но операционная система вернет все свои ресурсы, когда завершится. Если вы все равно уходите, зачем вообще заморачиваться с TerminateThread()? Просто ExitProcess() и покончим с этим.   -  person Luke    schedule 31.10.2011
comment
Но почему это плохо, не выйдет чисто? Вы используете сарказм. Вы можете объяснить? Я серьезно...   -  person ahmd0    schedule 31.10.2011


Ответы (1)


TerminateThread, вероятно, только усугубит ситуацию, так как критические секции будут потеряны (и, если вам действительно не повезет, это будет критическая секция кучи или критическая секция загрузчика). Если вы действительно хотите выйти из уклонения как можно быстрее, просто TerminateProcess сами. Имейте в виду, что это обходит все DLL_PROCESS_DETACH и глобальные деструкторы, но вы сказали, что хотите выйти как можно быстрее.

person Raymond Chen    schedule 31.10.2011
comment
Спасибо за предложение. Итак, если это будет обходить DLL_PROCESS_DETACH, как это повлияет на что-либо, если мое приложение завершает работу и все равно будет выгружено из памяти? Вы можете объяснить. - person ahmd0; 31.10.2011
comment
Когда процесс завершается, вся его память сбрасывается, а все его дескрипторы закрываются. Это степень этого. Если вы оставили блок общей памяти в несогласованном состоянии, то это ваша проблема. - person Raymond Chen; 31.10.2011
comment
В ПОРЯДКЕ. Опять же, я просто пытаюсь это понять, и если вызов TerminateProcess приведет к тому, что моя программа каким-то образом повлияет на систему, то я не буду ее вызывать. Это то, что вы говорите? - person ahmd0; 31.10.2011
comment
TerminateProcess не повлияет на остальную часть системы, если только вы не настроили его таким образом (например, каким-то образом измененные общие ресурсы, которые не очищаются ОС автоматически). Кроме того, если ваш процесс имеет только один поток, то TerminateThread делает то же самое, что и TerminateProcess, поскольку последний в любом случае просто завершает все потоки в процессе. - person wj32; 31.10.2011