Информация об изменениях

Сообщение Re[2]: Вопросы по функциям _beginthreadex и _endthreadex от 11.01.2017 13:34

Изменено 11.01.2017 14:28 Evgeniy Skvortsov

Re[2]: Вопросы по функциям _beginthreadex и _endthreadex
Здравствуйте, RussianFellow, Вы писали:


RF>1) Когда вызываем функцию _beginthreadex, то после завершения работы потока (в результате использования функций WaitForSingleObject или WaitForMultipleObjects) обязательно ли следует закрывать дескриптор потока hThread (который был создан функцией _beginthreadex) с помощью функции CloseHandle(hThread); ?


Если поток создан при помощи _beginthread и выход из потока осуществляется посредством вызова функции _endthread, то не нужно (она сама закрывает хэндл).
Если поток создаётся с использованием AfxBeginThread, то же не нужно. Там внутри поток создаётся не напрямую, а создается экземпляр класса CWinThread, в деструкторе которого вызывается CloseHandle.

Во всех остальных случаях нужно вызвать CloseHandle, иначе возникает утечка ресурсов.

RF>2) Внутри потоковой функции обязательно ли использовать функцию _endthreadex для завершения работы потока или же можно завершить этот поток с помощью return в потоковой функции?

ExitThread is the preferred method of exiting a thread in C code. However, in C++ code, the thread is exited before any destructors can be called or any other automatic cleanup can be performed. Therefore, in C++ code, you should return from your thread function.

Понятно о чём речь? Кратко — в программах на с++ надо использовать return.

RF>Как я понял, для запуска работы потока лучше всего использовать функцию _beginthreadex, чем функции CreateThread или AfxBeginThread.


_beginthread или _beginthreadex надо использовать если в потоке вызываются какие-то функции CRT.
Re[2]: Вопросы по функциям _beginthreadex и _endthreadex
Здравствуйте, RussianFellow, Вы писали:


RF>1) Когда вызываем функцию _beginthreadex, то после завершения работы потока (в результате использования функций WaitForSingleObject или WaitForMultipleObjects) обязательно ли следует закрывать дескриптор потока hThread (который был создан функцией _beginthreadex) с помощью функции CloseHandle(hThread); ?


Если поток создан при помощи _beginthread и выход из потока осуществляется посредством вызова функции _endthread, то не нужно (она сама закрывает хэндл).
Если поток создаётся с использованием AfxBeginThread, то же не нужно. Там внутри поток создаётся не напрямую, а создается экземпляр класса CWinThread, в деструкторе которого вызывается CloseHandle.

Во всех остальных случаях нужно вызвать CloseHandle, иначе возникает утечка ресурсов.

RF>2) Внутри потоковой функции обязательно ли использовать функцию _endthreadex для завершения работы потока или же можно завершить этот поток с помощью return в потоковой функции?

ExitThread is the preferred method of exiting a thread in C code. However, in C++ code, the thread is exited before any destructors can be called or any other automatic cleanup can be performed. Therefore, in C++ code, you should return from your thread function.

Понятно о чём речь? Кратко — в программах на с++ надо использовать return.

RF>Как я понял, для запуска работы потока лучше всего использовать функцию _beginthreadex, чем функции CreateThread или AfxBeginThread.


_beginthread или _beginthreadex надо использовать если в потоке вызываются какие-то функции CRT.

А вообще Рихтер настоятельно рекомендует использовать _beginthreadex. Что в общем-то логично.