内核对象
2015-12-11 16:10
190 查看
图中红色部分为内核对象的创建过程,绿色为内核对象关闭过程。
几点说明:
1)一个进程当中可以有多个句柄指向同一个内核对象,但是句柄的值是不同的。一个句柄的关闭另一个句柄照常使用。因为内核对象的引用计数器的个数不为0。
2)线程内核对象创建的时候操作系统分配内核对象,并将内核对象的引用计数器设为2,这是因为如果引用计数器设为1的话当在主线程中调用CloseHandle时操作系统就会析构内核对象内存,这是子线程如果没有运行完就会产生严重错误,为了让子线程能够顺利运行结束,将引用计数器设为2。这时当子线程结束之后再将引用计数器减少1,这时再析构内核对象。
3)调用完CloseHandle()之后不要忘记将句柄变量设为NULL,如果不设为NULL,如果再调用该句柄会发生错误,严重情况是如果该句柄索引分配给新的内核对象,并且内核对象的类型和原来的内核对象类型一致,这时程序行为会异常。
4)创建完内核对象之后如果忘记调用CloseHandle(),则会导致进程的句柄表溢出,并且能导致进程运行期间内核对象泄露。
几点说明:
1)一个进程当中可以有多个句柄指向同一个内核对象,但是句柄的值是不同的。一个句柄的关闭另一个句柄照常使用。因为内核对象的引用计数器的个数不为0。
2)线程内核对象创建的时候操作系统分配内核对象,并将内核对象的引用计数器设为2,这是因为如果引用计数器设为1的话当在主线程中调用CloseHandle时操作系统就会析构内核对象内存,这是子线程如果没有运行完就会产生严重错误,为了让子线程能够顺利运行结束,将引用计数器设为2。这时当子线程结束之后再将引用计数器减少1,这时再析构内核对象。
3)调用完CloseHandle()之后不要忘记将句柄变量设为NULL,如果不设为NULL,如果再调用该句柄会发生错误,严重情况是如果该句柄索引分配给新的内核对象,并且内核对象的类型和原来的内核对象类型一致,这时程序行为会异常。
4)创建完内核对象之后如果忘记调用CloseHandle(),则会导致进程的句柄表溢出,并且能导致进程运行期间内核对象泄露。
相关文章推荐
- 关于html中的<div>框
- git常用命令总结
- My安装Eclipse三种方法插件
- 用CocoaPods做iOS程序的依赖管理
- 批处理文件的@echo off是什么意思?
- C#发送Email邮件三种方法的总结
- Java 之 文件读写及性能比较总结
- Android自定义View的实现方法
- Java实现输入
- SpringMVC中使用Interceptor拦截器
- 学习笔记20151211— 4000 —AXI4 STREAM DATA FIFO
- Linux 中直接 I/O 机制的介绍
- Sql Server中的日期与时间函数
- Python模板库Mako的语法
- 汇编指令详解
- IOS开发 文件下载 文件预览
- java中PipedOutputStream和PipedInputStream类用法
- OC-030.分类(类别)
- Linux命令学习笔记(5)----wc命令
- ThinkPHP3.1分页时,采用联表查询的处理