一般,我们创建一个新的线程、互斥量等时,内核会为我们在内存的内核区生成一个对应的内核对象。注意:
- 内核对象是一个数据结构,而非可执行代码的地址,当然也不是某一资源(比如互斥量)本身。它只是一个数据结构,包含了一些成员变量,而这些变量记录着对应资源相关的信息(比如对象的引用计数)。
- 其中,进程对象以及线程对象与一般内核对象在创建后引用计数不同。
Handle hThread=CreatetThread(NULL........); Handle hMutex=CreateMutex(.......);
上述两行代码,分别创建了一个线程内核对象,以及一个互斥量内核对象。我们知道,内核创建一个内核对象后,会将其引用计数设置为1。那么为什么有时候我们经常看到在创建线程后,立即使用CloseHandle来关闭线程句柄呢。
如果我们深入分析一下线程内核对象的数据结构,我们就知道原因了。在线程的内核对象中,有一个Handle成员变量,它保存着该线程对象的句柄。虽然我们不知道它是采用何种方式获得内核对象句柄的,但是我们可以肯定的是,这是由于该变量的存在,我们的线程内核对象的引用计数又增加了1。也就是,调用创建线程的函数后,线程内核对象引用计数变为2。所以,我们可以在创建后,立即关闭线程内核对象句柄,(只表示,调用线程对新线程不再感兴趣啦,新线程仍然继续执行,要知道,此时,引用计数为1,而非0,所以内核对象依然存在啊)。
如有任何问题,欢迎留言。