English 中文(简体)
为什么这个代码在Windows 7 Beta上失去了处理程序?
原标题:
  • 时间:2009-02-16 10:05:17
  •  标签:

我正在寻找一个旧的C++应用程序中的一些随机崩溃。使用Sysinternals(系统工具集合)进程浏览器,我注意到应用程序正在丢失句柄,并提取了确切的情况,即程序在一个非常短的代码片段中丢失句柄。

DWORD WINAPI MyTestThread( void*  PThread)
{
 _endthreadex(0);
 return 0;
}

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR  PParameter, int)
{
 for (int i=0;i<10000;i++)
 {
   unsigned int threadID;
   HANDLE hThread= (HANDLE)_beginthreadex( (void*)NULL, (unsigned int)32768, (unsigned int (__stdcall *)(void *))MyTestThread, (void*)NULL, (unsigned int)0, &threadID);
   WaitForSingleObject((HANDLE)hThread, 1000);
   CloseHandle((HANDLE)hThread);
 }
 return 0;
}

My problem: I can t figure out what s wrong with this code. It loses exactly 5 handles on every iteration, but it looks OK to me.
Funny thing: it seems not to lose handles on windows vista, but I d be very surprised if this should be a bug in windows 7.

[更新] 我尝试使用 _beginthread/_endthread 和 CreateThread/ExitThread,这两个和 _beginthreadex 一样都会失去5个句柄。

【第二次更新】代码如预期运行。所有返回值都很好。只是像没有明天一样失去句柄。

[3rd Update] Big new Info The code only loses handles, if compiled with /clr! And more, if I call GC::Collect() on each iteration the handles will be reclaimed!
So, how do I find what clr-objects are being collected there?

最佳回答

检查一下链接至你的exe的某些DLL,在收到DLL_THREAD_ATTACH通知时,是否在其DLLMain中做了一些奇怪的事情。

问题回答

你检查过函数是否成功了吗?返回值和GetLastError()可能会给出一些提示,出了什么问题。

http://msdn.microsoft.com/en-us/library/kdzttdcb.aspx

如果成功,这些函数中的每一个都会返回一个指向新创建线程的句柄;然而,如果新创建的线程退出得太快,则_beginthread可能不会返回有效的句柄(请参见备注部分中的讨论)。_beginthread返回-1L表示错误,此时errno会被设置为EAGAIN(如果线程太多)、EINVAL(如果参数无效或堆栈大小不正确)或EACCES(如果资源不足,例如内存)。_beginthreadex返回0表示错误,此时errno和_doserrno会被设置。

你的线程退出得相当快,是吗?

你有尝试使用Win32的CreateThread对此进行测试吗?这可能会将问题缩小至CRT。





相关问题
热门标签