核心对象用来保存线程切换需要的信息,删了还怎么调度线程啊
但是记数为0还不删的话,要到什么时候删啊

解决方案 »

  1.   

    我的理解:
    线程创建后,退出前,至少系统还引用着线程对象,所以计数至少为1,不会删除。等线程运行结束了,系统也会CloseHandle一下(或者说相当于这样),那时如果再也没有其他地方通过句柄引用这个线程,计数器就减为0,对象就可以回收了。
    系统如果不引用线程,又如何能够调度线程呢?我们都知道线程不是应用程序自己调度的呀。所以应用程序只是关闭了它自己引用的那个句柄,防止句柄泄漏而已。
      

  2.   

    CloseHandle()唯一做的事情就是使引用计数减1。线程核心对象的默认引用参数是2,CloseHandle()使计数减1,线程结束再减1,对象才会被销毁。
      

  3.   

    看核心程上这段话
    As already mentioned, creating a new process causes the system to create a process kernel object and a thread kernel object. At creation time, the system gives each object an initial usage count of 1. Then, just before CreateProcess returns, the function opens the process object and the thread object and places the process-relative handles for each in the hProcess and hThread members of the PROCESS_INFORMATION structure. When CreateProcess opens these objects internally, the usage count for each becomes 2.也就是说,如果CreateThread不是在CreateProcess中被调用,那么计数是1
    这样的话,关闭一次就变成0了
      

  4.   

    就CreateThread 是2的话,那么在CreateProcess中调用,那就变成3了书上不会错吧
      

  5.   

    "线程创建后马上CloseHandle(hThread),线程核心对象会马上会删除吗? "
    简单地说:
       原理楼上的已经说了.一般说来对于CreateThread得到的hTread对于我们来说用处是不太大的,所以一般地在CreateThread后就立即Close了.
       线程什么时候结束?就是线程执行到return retval;后就结束了.
       明白了?