比如刚创建了一个线程handle m_thread = creathread();然后立即closehandle(m_thread),有的人可能会不解,为啥刚创建的线程,要结束它呢,其实不然,它结束的不是线程,而是使内核对象的计数减1,这样一旦线程结束,内核对象又会再减1,就等于0了,系统就会释放内核对象,如果不closehandle的话,就算线程结束,内核对象仍然不会为0,一直保持着对内核对象的引用,直到进程结束,才能清理内核对象。
问题1:上面是我写的,可能不对,我就是不是很理解creathread后内核对象为什么就成了2了啊?
比如父进程通过creatprocess创建了一个子进程,那么首先先closehandle子进程返回的进程内核对象和线程内核对象,时其计数减一,因为在创建一个新的进程时,系统会为该进程建立一个进程内核对象和一个线程内核对象,而内核对象都有一个使用计数,系统会为这两个对象赋予初始的使用计数1,在createproces函数返回之前,它将打开创建的进程的对像和线程对象,并肩每个对象的进程和线程相关的句柄放在其最后一个参数。当createprocess函数再其内打开这些对象时,每个对象的使用计数就变为2.
问题2:这个也是,为啥创建的时候加1,打开时候又加1呢?

解决方案 »

  1.   

    windows核心编程讲的,谁解析下吗
      

  2.   

    CreateThread()调用创建线程时,系统设置线程内核对象的引用计数为1,在Create函数返回前,将会打开线程句柄,所以线程的内核对象引用计数+1。
    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.    
      

  3.   

    Sorry,英文内容贴成CreateProcess了,囧
      

  4.   

    那creathread跟creatprocess应该是一样的吧