刚刚遇到个问题,请教大家,一个线程用以下代码终止: 
if(::GetExitCodeThread(hThread1,&code)) 

  if(STILL_ACTIVE==code) 
  { 
      retVal=TerminateThread(hThread1,0); 
      CloseHandle(hThread1); 
  } 

运行时retVal返回1,说明TerminateThread已经成功执行,但是接下来用以下代码: retVal=::GetExitCodeThread(hThread1,&code); 
if(!retVal || code!=STILL_ACTIVE) 

  hThread1=CreateThread(NULL,0,ThreadProc1,(LPVOID)&data,0,NULL); 
} 这时retVal居然还返回1,并且code仍然等于STILL_ACTIVE,问题是前面已经把这个线程终止了,而且TerminateThread函数也执行成功了,但是现在出现这样的结果,如何解释,这是问什么呢?谢谢大家! 

解决方案 »

  1.   

    TerminateThread()函数强迫线程结束,线程没有机会在结束前清理自己,还有可能堆栈没被释放,造成内存泄露,这函数最好少用
      

  2.   

    实际上执行了这2句之后,hThread1已经是无效句柄了,因为当线程内核对象的引用为0以后,线程结束,它的内核对象也就被释放了,所以你再去GetExitCodeThread(hThread1,&code); 就是无效值了retVal=TerminateThread(hThread1,0); 
          CloseHandle(hThread1); 另外像1L说得那样,TerminateThread最好是少用
      

  3.   

    CloseHandle(hThread1); 会递减引用记数值
      

  4.   

    是啊,释放之后句柄hThread1是应该无效的了,但是GetExitCodeThread(hThread1,&code)还会成功,说句柄还有效,如果是1楼说的那样,那就明白了。
      

  5.   

    个人认为,第2次GetExitCodeThread(hThread1,&code)的code应该是没有意义的,CloseHandle(hThread1); 没有改变hThread1的值,它还是指向那个内核对象,如果没有被其他内核对象覆盖的话,它没有改变,所以第2次code==STILL_ACTIVE很正常。
      

  6.   

    个人认为,第2次GetExitCodeThread(hThread1,&code)的code应该是没有意义的,CloseHandle(hThread1); 没有改变hThread1的值,它还是指向那个内核对象,如果没有被其他内核对象覆盖的话,该对象没有改变,所以第2次code==STILL_ACTIVE很正常。
      

  7.   

    TerminateThread是异步的
    并不会立即中止线程
      

  8.   

    就向上面说的CloseHandle(hThread1)只会递减引用记数值,hThread1仍能指向的是内核对象中关于你这个线程的信息,TerminateThread(hThread1,0)只是强迫你的进程关闭,但是内核数据表里的关于你这个进程的信息可能还没来得及释放,仍在,这个GetExitCodeThread(hThread1,&code)函数肯定是查询内核对象,既然没有释放,那肯定返回的是1吧。