比如刚创建了一个线程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:上面是我写的,可能不对,我就是不是很理解creathread后内核对象为什么就成了2了啊?
比如父进程通过creatprocess创建了一个子进程,那么首先先closehandle子进程返回的进程内核对象和线程内核对象,时其计数减一,因为在创建一个新的进程时,系统会为该进程建立一个进程内核对象和一个线程内核对象,而内核对象都有一个使用计数,系统会为这两个对象赋予初始的使用计数1,在createproces函数返回之前,它将打开创建的进程的对像和线程对象,并肩每个对象的进程和线程相关的句柄放在其最后一个参数。当createprocess函数再其内打开这些对象时,每个对象的使用计数就变为2.
问题2:这个也是,为啥创建的时候加1,打开时候又加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.