线程、进程内核对象引用计数问题
2011-07-22 16:06
274 查看
一般,我们创建一个新的线程、互斥量等时,内核会为我们在内存的内核区生成一个对应的内核对象。注意:
内核对象是一个数据结构,而非可执行代码的地址,当然也不是某一资源(比如互斥量)本身。它只是一个数据结构,包含了一些成员变量,而这些变量记录着对应资源相关的信息(比如对象的引用计数)。
其中,进程对象以及线程对象与一般内核对象在创建后引用计数不同。
上述两行代码,分别创建了一个线程内核对象,以及一个互斥量内核对象。我们知道,内核创建一个内核对象后,会将其引用计数设置为1。那么为什么有时候我们经常看到在创建线程后,立即使用CloseHandle来关闭线程句柄呢。如果我们深入分析一下线程内核对象的数据结构,我们就知道原因了。在线程的内核对象中,有一个Handle成员变量,它保存着该线程对象的句柄。虽然我们不知道它是采用何种方式获得内核对象句柄的,但是我们可以肯定的是,这是由于该变量的存在,我们的线程内核对象的引用计数又增加了1。也就是,调用创建线程的函数后,线程内核对象引用计数变为2。所以,我们可以在创建后,立即关闭线程内核对象句柄,(只表示,调用线程对新线程不再感兴趣啦,新线程仍然继续执行,要知道,此时,引用计数为1,而非0,所以内核对象依然存在啊)。 如有任何问题,欢迎留言。
内核对象是一个数据结构,而非可执行代码的地址,当然也不是某一资源(比如互斥量)本身。它只是一个数据结构,包含了一些成员变量,而这些变量记录着对应资源相关的信息(比如对象的引用计数)。
其中,进程对象以及线程对象与一般内核对象在创建后引用计数不同。
Handle hThread=CreatetThread(NULL........); Handle hMutex=CreateMutex(.......);
上述两行代码,分别创建了一个线程内核对象,以及一个互斥量内核对象。我们知道,内核创建一个内核对象后,会将其引用计数设置为1。那么为什么有时候我们经常看到在创建线程后,立即使用CloseHandle来关闭线程句柄呢。如果我们深入分析一下线程内核对象的数据结构,我们就知道原因了。在线程的内核对象中,有一个Handle成员变量,它保存着该线程对象的句柄。虽然我们不知道它是采用何种方式获得内核对象句柄的,但是我们可以肯定的是,这是由于该变量的存在,我们的线程内核对象的引用计数又增加了1。也就是,调用创建线程的函数后,线程内核对象引用计数变为2。所以,我们可以在创建后,立即关闭线程内核对象句柄,(只表示,调用线程对新线程不再感兴趣啦,新线程仍然继续执行,要知道,此时,引用计数为1,而非0,所以内核对象依然存在啊)。 如有任何问题,欢迎留言。
相关文章推荐
- 线程、进程内核对象引用计数问题
- 为什么CreateThread()调用创建线程时,系统设置线程内核对象的引用计数为1,在Create函数返回前是2
- 关于"栈"对象弱引用的线程安全问题
- 线程内核对象的释放问题
- 进程与线程(五)用内核对象进行线程同步(上)
- OC学习篇之---数组对象的引用计数问题和自动释放池的概念
- 进程、线程及内核对象
- python中对象引用计数的相关问题
- OC学习篇之---数组对象的引用计数问题和自动释放池的概念
- OC学习篇之---数组对象的引用计数问题和自动释放池的概念
- 拷贝带引用计数的对象时要注意的问题
- 线程核心对象的引用计数
- (CloseHandle函数)内核对象、进程和线程
- 获取内核对象的引用计数
- 进程与线程(六)用内核对象进行线程同步(下)
- OC学习篇之---数组对象的引用计数问题和自动释放池的概念
- 关于内核进程对象的存活期问题。
- JAVA别名问题----JAVA程序需要注意的对象引用
- 关于java线程、进程的一些问题
- java中,引用对象时常遇到的问题