Сообщение 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 в потоковой функции?
RF>Как я понял, для запуска работы потока лучше всего использовать функцию _beginthreadex, чем функции CreateThread или AfxBeginThread.
_beginthread или _beginthreadex надо использовать если в потоке вызываются какие-то функции CRT.
RF>1) Когда вызываем функцию _beginthreadex, то после завершения работы потока (в результате использования функций WaitForSingleObject или WaitForMultipleObjects) обязательно ли следует закрывать дескриптор потока hThread (который был создан функцией _beginthreadex) с помощью функции CloseHandle(hThread); ?
Если поток создан при помощи _beginthread и выход из потока осуществляется посредством вызова функции _endthread, то не нужно (она сама закрывает хэндл).
Если поток создаётся с использованием AfxBeginThread, то же не нужно. Там внутри поток создаётся не напрямую, а создается экземпляр класса CWinThread, в деструкторе которого вызывается CloseHandle.
Во всех остальных случаях нужно вызвать CloseHandle, иначе возникает утечка ресурсов.
RF>2) Внутри потоковой функции обязательно ли использовать функцию _endthreadex для завершения работы потока или же можно завершить этот поток с помощью return в потоковой функции?
Понятно о чём речь? Кратко — в программах на с++ надо использовать 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.
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 в потоковой функции?
RF>Как я понял, для запуска работы потока лучше всего использовать функцию _beginthreadex, чем функции CreateThread или AfxBeginThread.
_beginthread или _beginthreadex надо использовать если в потоке вызываются какие-то функции CRT.
А вообще Рихтер настоятельно рекомендует использовать _beginthreadex. Что в общем-то логично.
RF>1) Когда вызываем функцию _beginthreadex, то после завершения работы потока (в результате использования функций WaitForSingleObject или WaitForMultipleObjects) обязательно ли следует закрывать дескриптор потока hThread (который был создан функцией _beginthreadex) с помощью функции CloseHandle(hThread); ?
Если поток создан при помощи _beginthread и выход из потока осуществляется посредством вызова функции _endthread, то не нужно (она сама закрывает хэндл).
Если поток создаётся с использованием AfxBeginThread, то же не нужно. Там внутри поток создаётся не напрямую, а создается экземпляр класса CWinThread, в деструкторе которого вызывается CloseHandle.
Во всех остальных случаях нужно вызвать CloseHandle, иначе возникает утечка ресурсов.
RF>2) Внутри потоковой функции обязательно ли использовать функцию _endthreadex для завершения работы потока или же можно завершить этот поток с помощью return в потоковой функции?
Понятно о чём речь? Кратко — в программах на с++ надо использовать 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.
RF>Как я понял, для запуска работы потока лучше всего использовать функцию _beginthreadex, чем функции CreateThread или AfxBeginThread.
_beginthread или _beginthreadex надо использовать если в потоке вызываются какие-то функции CRT.
А вообще Рихтер настоятельно рекомендует использовать _beginthreadex. Что в общем-то логично.