我是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
它会在函数结束时自动调用它,但是你应该调用它来更好地清理内存,这就是我尝试将其放入的原因。它似乎不对,对不起,如果这是一个糟糕的问题。我只是想确保我尽我所能做正确的事情
答案 0 :(得分:9)
您实际上根本不需要致电_endthreadex()
。无论如何,在线程函数返回后,它将自动为您调用。
答案 1 :(得分:4)
答案已在短版本中给出,如果您想了解更多 - 您的函数返回实际上将被用作_endthreadex
调用中的参数。以下是启动线程时运行时正在执行的操作。该线程确实以CRT中的某个起点开始,其中内部_callthreadstartex
正在执行:
_endthreadex(MyThreadFunction(...));
也就是说,只要你回来,就会立即为你调用_endthreadex
,它将从线程退出。
你能明确地使用它吗?是的,你可以,并且你的代码也很好,因为无论你是自己调用它还是为你调用它都没关系,前提是没有泄漏发生在路上(例如,特别是,尚未被称为析构函数)局部变量)。
因为无论如何都会为你调用,并且从函数返回在释放本地资源方面更安全,所以没有使用,优势和意义来进行显式调用。
MSDN基本上解释了Remarks section中完全相同的内容。
您可以显式调用_endthread或_endthreadex来终止 线;但是,_endthread或_endthreadex会自动调用 当线程从作为参数传递的例程返回时 _beginthread或_beginthreadex。通过调用endthread或_endthreadex来终止线程有助于确保正确恢复资源 为线程分配。
答案 2 :(得分:2)
如前所述,您不必打电话给它。关于你的代码,我认为最终return 0;
甚至不会被调用,因为_endthreadex()
永远不会返回。这也可能导致不调用本地对象的析构函数(这是我认为MSDN想要说的),因此使用此函数甚至可能在C ++中有害。考虑使用Boost.Thread,它们有一个专门用于结束线程的异常,如果你想在中间的某个地方终止线程,它应该做正确的事情。