В моем настольном приложении я создал простой поток, используя _beginthreadex (...). Интересно, что произойдет, если мое приложение будет закрыто (без явного закрытия потока)? Будут ли очищаться все ресурсы внутри потока? У меня есть сомнения. Поэтому мне нравится завершать поток, когда мое приложение будет закрыто. Интересно, какая была бы лучшая практика? Использование _endthreadex возможно только внутри (!) Потока и что-то вроде TerminateThread (...), похоже, не работает (бесконечный цикл). У вас есть советы?
Когда основной выход из ваших других потоков будет уничтожен.
Лучше всего провести главное ожидание на ваших других потоках, используя их ручки и отправить им сообщение (возможно, используя событие), чтобы сигнализировать о выходе. Затем Main может сигнализировать о событии и ждать, пока другие потоки завершат то, что они делают, и выйдите из него чисто. Конечно, это требует, чтобы потоки периодически проверяли событие, чтобы увидеть, нужно ли им выйти.
Когда основной поток выходит, приложение и все его ресурсы очищаются. Это будет включать в себя другие темы и их ресурсы.
Кроме того, отправьте код, который у вас есть для TerminateThread
, потому что он работает.
Самый простой способ - отправить сообщение (или иначе указать через событие) сообщение о том, что протектор должен завершиться и позволить ему освободить свои ресурсы и выйти из функции точки входа.
Чтобы закрыть поток, вам нужно вызвать CloseHandle() с помощью дескриптора, возвращаемого _beginthreadex.
Этот поток является частью процесса, поэтому, когда процесс завершается, он берет поток с ним, и операционная система возобновит владение всеми двумя собственными, поэтому все ресурсы будут выпущены.
Имейте в виду, что если вы не предупредили нить, которая находится на конце, она может быть в середине какой-либо работы, когда она закончится. Если он находится в середине использования любой системы или внешних ресурсов, они будут освобождены, но могут находиться в состоянии фанки (например, файл может быть частично написан и т.д.).
См. Также http://www.bogotobogo.com/cplusplus/multithreading_win32A.php
Примечание. Использование CloseHandle() предназначено только для _beginthreadex, а не для использования _beginthread. См. Http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.90).aspx
_endthread automatically closes the thread handle (whereas _endthreadex does not). Therefore, when using _beginthread and _endthread, do not explicitly close the thread handle by calling the Win32 CloseHandle API. This behavior differs from the Win32 ExitThread API.
MSDN OP прямо сказал «_beginthreadex»._beginthread
и_beginthreadex
различаются, и необходимость вызоваCloseHandle
среди них отсутствует. К счастью, Visual Studio поставляется с исходным кодом CRT, аthreadex.c
действительно не содержит вызоваCloseHandle
.