我正在阅读关于_beginthreadex
和_endthreadex
的{{3}},但有一些我不明白的事情。
请注意,文档会同时记录“扩展”和普通函数,但我没有使用_beginthread
和_endthread
;只有他们的扩展版本。
您可以调用_endthread或 _endthreadex显式终止一个线程;但是,_endthread或 当线程从线程返回时,会自动调用_endthreadex 例程作为参数传递。 通过调用终止线程 endthread或_endthreadex有助于 确保适当的资源回收 为线程分配。
_endthreadex
,如何调用它有助于确保“正确恢复资源”?无论我是否打电话,它都不应该有任何区别,或者是这样吗?_endthread会自动关闭线程句柄(而_endthreadex 才不是)。因此,使用时 _beginthread和_endthread,不要显式关闭线程句柄 调用Win32 CloseHandle API。
_endthreadex
没有关闭句柄,为什么我不应该使用CloseHandle
关闭它?我的所有主题只是通过从主函数返回而自动终止,并且从不强行终止。根据文档,当发生这种情况时,会自动调用_endthreadex
。
这虽然不会关闭手柄。假设我确实需要关闭它,尽管如上所述,我怎么能这样做,因为此时线程已经死了?我应该以某种方式从另一个线程关闭它吗?如果我把它打开会怎么样?
答案 0 :(得分:5)
如果自动调用_endthreadex,为什么调用它有助于确保“正确恢复资源”?无论我是否打电话,它都不应该有任何区别,或者是这样吗?
我认为他们的意思是在你不使用标准方式终止你的线程的情况下。
如果_endthreadex没有关闭 处理,为什么我不应该关闭它 用CloseHandle?
使用CloseHandle
时,您应该使用_endthreadex
关闭它。文档说只有_endthread
关闭句柄(因此CloseHandle
调用是多余的。)
我的所有主题都是自愿的 从他们的主要回来终止 功能,永远不会有力 终止。根据 文档,当这发生时 _endthreadex会自动调用。
从启动它的线程中关闭线程句柄是一种常用的解决方案。您应该记住句柄并在适当的位置等待线程完成(使用WaitForSingleObject
)然后关闭其句柄。如果不这样做,将导致资源泄漏。如果你有一些线程,这通常不是一个大问题,但这绝对不是一个好习惯。