繁体   English   中英

我在哪里使用_endthreadex - windows API

[英]Where do I use _endthreadex - windows API

我是Windows API的新手,最近我了解到我不应该使用CreateThread和TerminateThread。 我切换到_beginthreadex ,但是我不确定我应该如何use _endthreadex

例如 ,这是我正在测试的基本功能:

// MyThreadFunction - outputs "#.) I Work" and ends
unsigned int __stdcall MyThreadFunction( void * lpParam ) 
{
    int i = (int)lpParam;
    cout << i << ".) I work! " << endl;
    _endthreadex(0);
    return 0;
}

我的_endthreadex位置是否正确? 在返回0之前我有它,这对我来说似乎很奇怪? 我在msdn页面中读到_endthreadex它是在函数结束时自动调用的,但你应该调用它以获得更好的内存清理,这就是我尝试将其放入的原因。它只是看起来不对,对不起,如果这是一个糟糕的问题。 我只是想确保我尽我所能做正确的事

实际上你根本不需要调用_endthreadex() 无论如何,在线程函数返回后,它将自动为您调用。

答案已在短版本中给出,如果您想了解更多 - 函数的返回实际上将用作_endthreadex调用中的参数。 以下是启动线程时运行时正在执行的操作。 该线程确实以CRT中的某个起点开始,其中内部_callthreadstartex正在执行:

_endthreadex(MyThreadFunction(...));

也就是说,一旦你返回, _endthreadex将立即为你调用,它将退出线程。

你能明确地使用它吗? 是的,你可以,并且你的代码也很好,因为无论你是自己调用它还是为你调用都没关系,前提是没有泄漏发生在路上(例如,特别是,尚未被称为析构函数)局部变量)。

因为无论如何都会为你调用,并且从函数返回在释放本地资源方面更安全,所以没有使用,优势和意义来进行显式调用。

MSDN基本上在备注部分解释完全相同。

您可以显式调用_endthread或_endthreadex来终止线程; 但是,当线程从作为参数传递的例程返回到_beginthread或_beginthreadex时,会自动调用_endthread或_endthreadex。 通过调用endthread或_endthreadex来终止线程有助于确保正确恢复为线程分配的资源。

如前所述,您不必调用它。 关于你的代码,我认为最终return 0; 甚至不会被调用,因为_endthreadex()永远不会返回。 这也可能导致不调用本地对象的析构函数(这是我认为MSDN想要说的),因此使用此函数甚至可能在C ++中有害。 考虑使用Boost.Thread,它们有一个专门用于结束线程的异常,如果你想在中间的某个地方终止线程,它应该做正确的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM