WaitForSingleObject等待线程结束后closehandle 出错

WaitForSingleObject等待线程结束后closehandle 报错
    HANDLE handle1=NULL,handle2=NULL;
handle1=(HANDLE)_beginthread(rebuild,0,NULL);

handle2=(HANDLE)_beginthread(location,0,NULL);

printf("all thread started!\n");
WaitForSingleObject(handle1,INFINITE);
Sleep(30);
//CloseHandle(handle1);
CloseHandle(handle2);
return 0;
如果把两个句柄都用CloseHandle关闭,会报错:0xC0000008: An invalid handle was specified
但如果像上面那样把CloseHandle(handle1)注释掉,就不会报错。
两个线程都是自然返回,location线程先返回,然后触发rebuild线程返回。差别就是WaitForSingleObject(handle1,INFINITE);
为什么WaitForSingleObject之后关闭这个句柄会报错?
希望大牛们帮忙,谢谢
------解决思路----------------------
你理解错了,线程内核对象的内部初始使用计数为2 从线程函数返回时会递减使用计数. 此时线程已经终止,但线程内核对象的使用计数为1 线程内核对象并不会释放.你调用_beginthreadex线程终止时使用计数为1 调用_beginthread终止时使用计数由于_endthread内部调用了CloseHandle使用计数变为0 释放线程内核对象,而_beginthreadex中线程终止时使用计数为1 要显示调用CloseHandle才会释放.你上面那样写hand1 hand2线程终止时都已无效,至于CloseHandle(handle2)若hand2肯定是指向了程序中分配的其他内核对象.就好像内存的读越界,产生的结果是不可预料的.CloseHandle(handle2)你把其他内核对象的使用计数递减了.
------解决思路----------------------
引用:
Quote: 引用:

HANDLE handle1=NULL,handle2=NULL; 
    handle1=(HANDLE)_beginthread(rebuild,0,NULL);
       handle2=(HANDLE)_beginthread(location,0,NULL); 
          printf("all thread started!\n"); 
    WaitForSingleObject(handle1,INFINITE);
CloseHandle(handle1); 
WaitForSingleObject(handle2,INFINITE);
    CloseHandle(handle2); 
    return 0; 

是handle2对应的线程先返回,所以没必要WaitForSingleObject(handle2,INFINITE)吧?

那就先WaitForSingleObject(handle2,INFINITE),再WaitForSingleObject(handle1,INFINITE)要不死锁了,一定要保证顺序。其实我是不建议楼主这样写代码的,因为顺序搞不好就死住了。

虽然我不太知道你问题的原因是什么,但不管怎么样我建议还是需要等待的,因为等到线程句柄才能说明线程真正地结束了,这是一个好的习惯;

你按我说的式式,看看还有没有问题。