我在看代码时发现,如下一段代码:HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);
CloseHandle(threadhandle);不明白为什么创建线程后,要马上把线程的句柄关闭,这样做的目的是什么? 这样做会杀掉线程吗?

解决方案 »

  1.   

    1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。2,所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。
      

  2.   

    CloseHandle只是将句柄的引用计数减一,不会杀掉线程,一般的做法是先结束线程再CloseHandle
      

  3.   

    内核对象由内核所拥有,而不是由进程所拥有。在C l o s e H a n d l e 返回之前,它会清除进程的句柄表中的项目,该句柄现在对你的进程已经无效,不应该试图使用它。无论内核对象是否已 经撤消,都会发生清除操作。当调用C l o s e H a n d l e 函数之后,将不再拥有对内核对象的访问权,不过,如果该对象的使用计数没有递减为 0 ,那么该对象尚未被撤消。这没有问题,它只是意味着一个或多个其他进程正在使用该对象。当其他进程停止使用该对象时(通过调用C l o s e H a n d l e ),该对象将被撤消。
      

  4.   

     内核对象由内核拥有,并不是进程所拥有。每个内核对象都有一个计数器来存储有多少个进程在使用它的信息。   内核对象有安全描述符的保护,安全描述符描述了谁创建了该对象以及谁能够使用该对象。用于创建内核对象的函数几乎都有一个指向SEC URITY_ATTRIBUTES 结构的指针作为其参数。进程初次初始化时,句柄表是空的。进程中的线程调用创建内核对象的函数时,内核就为相应的内核对象分配一个内存块,并初始化。内核对进程的句柄表进行扫描,找到一个空项,用对象的数据结构的内存地址进行初始化。下面是一些创建内核对象的函数: 
      1   HANDLE CreateThread(
     2     PSECURITY_ATTRIBUTES psa,
     3     DWORD dwStackSize,
     4     PTHREAD_START_ROUTINE pfnStartAddr,
     5     PVOID pvParam,
     6     DWORD dwCreationFlags,
     7     PDWORD pdwfhreadId);
     8   关闭内核对象
       不论通过何种方式创建内核对象,都通过调用CloseHandle方法来结束对内核对象的操作。
       BOOL CloseHandle(HANDLE hobj);
       为什么结束进程能释放所有占用的资源?进程在运行时有可能出现内存泄漏。在进程终止运行时,系统会自动扫描进程的句柄表。若表中拥有任何无效项目(进程终止前没关闭的对象),系统将关闭这些对象的句柄。对象的计数器被置0,内核便会撤销这些对象。
      

  5.   

    CloseHandle(threadhandle)后,如果threadhandle内核对象为0,那么此线程还能运行吗?还是被杀掉了?
      

  6.   

    CloseHandle只是改变引用计数,threadhandle怎么会为0如果你是这样做,那么在你的程序中就不能使用这个句柄了,但是线程还是会运行,直到结束
    HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL); 
    CloseHandle(threadhandle); 
    threadhandle = NULL;
      

  7.   

    创建线程后返回了线程句柄,新创建的线程内核对象的使用计数是2,一个是线程本身,一个是创建线程的线程,创建线程的线程closehandle后,新的线程的内核对象使用计数为1,当这个新线程结束运行后内核对象的使用计数还要减1,这时内核对象的使用计数是0,则系统会自动删除新线程的内核对象,这是正常的处理流程。
    你如果不显示的调用closehandle,则新线程结束运行后,由于内核对象使用计数为1,所以不会删除内核对象,会造成内存泄露,不过当整个进程结束时操作系统会自动关闭该进程的所有的内核对象包括这个新线程的内核对象,所以你不调用closehandle问题不大,只是在你的进程运行的时候会造成内存泄露,进程结束后系统是会自动清理的。
      

  8.   

       如果不是频繁的创建线程 句柄关不关都无所谓   (从规范的角度来说  还是CLOSE一下吧 呵呵)
    threadhandle   等同于 OpenThread 一个线程ID