一个线程创建后如果设置了CREATE_SUSPENDED flag,但是由于其他原因需要退出,这个时候怎么办?比如:BOOL bError = FALSE;
DWORD dwThreadId = 0;
HANDLE hThread = ::CreateThread(NULL,0,WorkerThread,this,CREATE_SUSPENDED,&dwThreadId);
...... 
// 后续步骤,出现异常了
//这个时候由于其他步骤的异常需要终止此次的线程启动,我一般是这么做的:
if (bError)
::CloseHandle(hThread);
else
::ResumeThread(hThread);
return 0;这种情况下,那个线程函数出于什么状态?释放了没?还在内存挂着么?

解决方案 »

  1.   

    closehandle()函数又不是用来终止线程或者进程的,是用来防止系统分配的内核对象的内存溢出的(当线程正常退出后),应为createthread导致该线程内核对象的计数值为2,多余的一次就是用closehandle来关闭的。
      

  2.   

    用TerminateThread强制结束线程。或者先Resume线程,在线程里面判断条件自己推出。
      

  3.   

    嗯,后者可行。我不太明白这时候的线程出于什么状态,所需要的TLS是否都已经创建?如果简单的释放句柄资源,势必会带来不可预知的后果。
      

  4.   


    MSDN的解释:
    CREATE_SUSPENDED The thread is created in a suspended state and does not run until the ResumeThread function is called. 
    The thread can be run immediately after creation if the flag is not specified.就是说线程已经创建好了,只是处于挂起状态。和先创建就运行再Suspend的效果是一样的。
    至于CloseHandle是和结束线程没有关系,你可以在线程结束前CloseHandle,这时只是释放了句柄资源,线程并未结束,还得自己结束。