Проблемы с пониманием документации MSDN по _beginthreadex и _endthreadex - PullRequest
3 голосов
/ 17 октября 2010

Я читаю документацию о _beginthreadex и _endthreadex, но есть несколько вещей, которые я не понимаю.

Обратите внимание, что документация продолжает документировать "расширенные" и обычные функции одновременно, но я не использую _beginthread и _endthread; только их расширенные версии.


Вы можете позвонить _endthread или _endthreadex явно прекратить поток; однако _endthread или _endthreadex вызывается автоматически, когда поток возвращается из Процедура передается в качестве параметра. Завершение потока вызовом endthread или _endthreadex помогает обеспечить правильное восстановление ресурсов выделено для потока.

  • Если _endthreadex вызывается автоматически, почему он помогает обеспечить «правильное восстановление ресурсов»? Не должно иметь никакого значения, называю я это или нет, или это так?

_endthread автоматически закрывает дескриптор потока (тогда как _endthreadex не). Поэтому при использовании _beginthread и _endthread, не закрывайте дескриптор потока явно вызов Win32 CloseHandle API.

  • Если _endthreadex не не закрывает ручку, почему я не должен закрывать ее с CloseHandle?
  • Все мои потоки только добровольно прекращают работу, возвращаясь из своей основной функции, и никогда не завершаются принудительно. Согласно документации, когда это происходит, _endthreadex вызывается автоматически.

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

1 Ответ

5 голосов
/ 17 октября 2010

Если _endthreadex вызывается автоматически, почему он помогает обеспечить «правильное восстановление ресурсов»?Не должно иметь никакого значения, назову ли я это или нет, или нет?

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

Если _endthreadex не закрывает дескриптор, почему я не должен закрывать его с помощью CloseHandle?

Вы должны закрыть его с помощью CloseHandle при использовании _endthreadex.В документации сказано, что только _endthread закрывает дескриптор (и, следовательно, вызов CloseHandle является излишним).

Все мои потоки только добровольно прекращают работу, возвращаясь из своей основной функции, и никогда не завершаются принудительно,Согласно документации, когда это происходит, _endthreadex вызывается автоматически.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...