unsigned int __stdcall myThreadFun(LPVOID lpParameter)
{
for(int i=0;i<10;i++)
{
printf("%d\n", 2);
Sleep(1000);
}
return 0;
}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
for(int i=0;i<5;i++)
{
HANDLE myHH = (HANDLE)_beginthreadex(NULL, 0, myThreadFun, NULL, 0, 0);
CloseHandle(myHH);
printf("myHH:%d\n", myHH);
Sleep(1000*2);
} getchar();
return 0;
}这段代码在运行后内核对象的计数只会增加,不会减少。但是如果修改成unsigned int __stdcall myThreadFun(LPVOID lpParameter)
{
//  for(int i=0;i<10;i++)
//  {
//  printf("%d\n", 2);
//  Sleep(1000);
//  }
printf("%d\n", 2);
return 0;
}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
for(int i=0;i<5;i++)
{
HANDLE myHH = (HANDLE)_beginthreadex(NULL, 0, myThreadFun, NULL, 0, 0);
CloseHandle(myHH);
printf("myHH:%d\n", myHH);
Sleep(1000*2);
} getchar();
return 0;
}就没有问题了。
像这样对于第一种情况,一个有循环操作的线程,如何再完成线程以后有效的关闭内核对象呢?
(不能用WaitForSingleObject等待结束,因为同一时间还需要其他的操作)

解决方案 »

  1.   

    把线程都创建出来,然后WaitForMultipleObjects等待所有线程结束
        HANDLE hThreads[5] = {NULL};
        for(int i=0;i<5;i++)
        {
            hThreads[i] = (HANDLE)_beginthreadex(NULL, 0, myThreadFun, NULL, 0, 0);
            //CloseHandle(myHH);
            printf("myHH:%d\n", myHH);
            Sleep(1000*2);
        }
        WaitForMultipleObjects(5, hThreads, TRUE);
        for(int i=0;i<5;i++)
        {
            CloseHandle(hThreads[i]);
        }
      

  2.   

    C/C++ code
    unsigned int __stdcall myThreadFun(LPVOID lpParameter)
    {
        for(int i=0;i<10;i++)
        {    
            printf("%d\n", 2);
            Sleep(1000);
        }    
        return 0;
    }int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        for(int i=0;i<5;i++)
        {
            HANDLE myHH = (HANDLE)_beginthreadex(NULL, 0, myThreadFun, NULL, 0, 0);
            CloseHandle(myHH);
            printf("myHH:%d\n", myHH);
            Sleep(1000*2);
        }    getchar();
        return 0;
    }
    这段代码在运行后内核对象的计数只会增加,不会减少。但是如果修改成 
    ===============================
    你怎么知道只会增加不会减少呢?CloseHandle调用了应该会减少计数的。
      

  3.   

    内核计数器和句柄一点关系都没有,或者说最多是一个指向关系。CloseHandle是通过句柄将对应的计数器-1,这样handle就无效了,但是你创建的线程还存在,只是你的主线程已经没有了这个线程的句柄。所以你必须再调用endthreadex()退出或者调用WaitForMultipleObjects等待所有线程结束。
      

  4.   

    togoblime:
    线程的创建是根据数据来的,所以不能一次性全都创建出来wltg2001:
    可以通过工具查看的