[英]Shouldn't I use _endthreadex() in thread procedure for stack unwinding?
[英]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.