Как завершить _beginthreadex ()?

0

В моем настольном приложении я создал простой поток, используя _beginthreadex (...). Интересно, что произойдет, если мое приложение будет закрыто (без явного закрытия потока)? Будут ли очищаться все ресурсы внутри потока? У меня есть сомнения. Поэтому мне нравится завершать поток, когда мое приложение будет закрыто. Интересно, какая была бы лучшая практика? Использование _endthreadex возможно только внутри (!) Потока и что-то вроде TerminateThread (...), похоже, не работает (бесконечный цикл). У вас есть советы?

Теги:
multithreading
visual-studio-2008

4 ответа

1

Когда основной выход из ваших других потоков будет уничтожен.

Лучше всего провести главное ожидание на ваших других потоках, используя их ручки и отправить им сообщение (возможно, используя событие), чтобы сигнализировать о выходе. Затем Main может сигнализировать о событии и ждать, пока другие потоки завершат то, что они делают, и выйдите из него чисто. Конечно, это требует, чтобы потоки периодически проверяли событие, чтобы увидеть, нужно ли им выйти.

0

Когда основной поток выходит, приложение и все его ресурсы очищаются. Это будет включать в себя другие темы и их ресурсы.

Кроме того, отправьте код, который у вас есть для TerminateThread, потому что он работает.

0

Самый простой способ - отправить сообщение (или иначе указать через событие) сообщение о том, что протектор должен завершиться и позволить ему освободить свои ресурсы и выйти из функции точки входа.

0

Чтобы закрыть поток, вам нужно вызвать 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

  • 0
    @MSalters Да, при использовании _beginthread и _endthread: _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».
  • 0
    Хм, эта статья MSDN противоречива. В нем перечислены 4 точки, в которых _beginthread и _beginthreadex различаются, и необходимость вызова CloseHandle среди них отсутствует. К счастью, Visual Studio поставляется с исходным кодом CRT, а threadex.c действительно не содержит вызова CloseHandle .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню