Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 难以理解MSDN';s关于_beginthreadex和_endthreadex的文档_C++_Multithreading_Winapi - Fatal编程技术网

C++ 难以理解MSDN';s关于_beginthreadex和_endthreadex的文档

C++ 难以理解MSDN';s关于_beginthreadex和_endthreadex的文档,c++,multithreading,winapi,C++,Multithreading,Winapi,我正在阅读关于\u beginthreadex和\u endthreadex的文章,但有一些事情我不明白 注意,文档同时记录了“扩展”函数和普通函数,但我没有使用\u beginthread和\u endthread;只有它们的扩展版本 您可以调用_endthread或 _endthreadex显式终止线程;但是_endthread或 _当线程从数据库返回时,将自动调用endthreadex 作为参数传递的例程。 通过调用来终止线程 endthread或_endthreadex有助于 确保适当

我正在阅读关于
\u beginthreadex
\u endthreadex
的文章,但有一些事情我不明白

注意,文档同时记录了“扩展”函数和普通函数,但我没有使用
\u beginthread
\u endthread
;只有它们的扩展版本


您可以调用_endthread或 _endthreadex显式终止线程;但是_endthread或 _当线程从数据库返回时,将自动调用endthreadex 作为参数传递的例程。 通过调用来终止线程 endthread或_endthreadex有助于 确保适当回收资源 分配给线程的

  • 如果自动调用
    \u endthreadex
    ,那么调用它如何帮助确保“正确恢复资源”?不管我叫不叫都没关系,是吗

_endthread自动关闭线程句柄(而 没有)。因此,当使用 _beginthread和_endthread,不要通过显式关闭线程句柄 调用Win32 CloseHandle API

  • 如果
    \u endthreadex
    没有关闭句柄,为什么我不应该用
    关闭句柄来关闭它
  • 我的所有线程只有在从其主函数返回时才会自动终止,并且从未强制终止。根据文档,发生这种情况时,会自动调用
    \u endthreadex

    但这不会关闭把手。假设我确实需要关闭它,不管上面说了什么,既然此时线程已经死了,我该怎么做呢?我应该从另一个线程关闭它吗?如果我让它开着怎么办

如果_endthreadex是自动调用的,那么调用它如何帮助确保“正确恢复资源”?不管我叫不叫都没关系,是吗

我想他们的意思是当你没有使用标准的终止线程的方法时

如果_endthreadex未关闭 把手,为什么我不应该关上它 有把手吗

使用
\u endthreadex
时,应使用
CloseHandle
将其关闭。文档说明只有
\u endthread
关闭句柄(因此
CloseHandle
调用是多余的)

我所有的线都是自愿的 从他们的主要目的地返回而终止 功能和功能从来都不是强制的 结束。根据 文档,当这种情况发生时 _将自动调用endthreadex


从启动线程的线程关闭线程句柄是一种常用的解决方案。您应该记住句柄,并在适当的位置等待线程完成(使用
WaitForSingleObject
),然后关闭其句柄。如果不这样做,将导致资源泄漏。如果有几个线程,这通常不是什么大问题,但这绝对不是一个好的做法。

如果关闭线程主函数中的句柄,会发生什么情况?我想这是一个未定义的行为。它可能会工作,可能会泄漏,可能会死锁,可能会崩溃。最糟糕的是,它可以随时改变,在不同的计算机之间也会有所不同。@KarelPetranek您能解释一下为什么从线程内调用
CloseHandle
会是未定义的行为吗?你能提供一份推荐信吗?
CloseHandle
的MSDN文档声明它不会终止线程,因此我看不出任何明显的原因,为什么它应该在线程内执行。@jamesdlin
创建这些对象的函数的文档表明,在完成对象时应该使用CloseHandle,以及关闭句柄后对象上的挂起操作会发生什么情况。通常,CloseHandle会使指定的对象句柄无效,减少对象的句柄计数,并执行对象保留检查。关闭对象的最后一个句柄后,该对象将从系统中删除。
要删除线程对象,必须终止线程,*然后*关闭线程的所有句柄
@KarelPetranek to me,这似乎类似于典型的
CreateProcess
用法,如果调用方不关心返回的进程和线程句柄,它会立即关闭它们。如果
CloseHandle
没有删除thread对象,那么即使在运行线程的句柄上调用了线程,线程本身也应该仍然有效,无论从哪个线程调用了
CloseHandle
。因此,在我的解释中,行为不应该是未定义的,最坏的情况是可能存在资源泄漏(但我也不认为这是真的)。