能力值:
( LV8,RANK:130 )
|
-
-
2 楼
关闭,是关闭句柄,不是结束线程
windows引入了对象管理机制,线程作为一种对象,创建后,返回的是一个线程句柄,
线程对象的存在,和线程的执行是两码事,线程对象要先存在了,然后才能执行,如果线程正在执行,线程对象不能销毁,
一个句柄代表了此对象被引用一次,如果打开多次对象,那么可以说多次引用这个对象,CloseHandle表示给引用次数减一,当引用次数为0时,表示对象可以被删除了
如果创建线程后,没有CloseHandle,那么,当线程退出时,线程对象将不会被清除,
但另有一个问题,程序员总是懒惰的,有时候就是懒得写CloseHandle,
因为没有CloseHandle线程创建后,对象始终不会被清除呢,答案是否定的,windows管理资源是以进程为单位的,也就是说,进程一但退出,那么,进程所打开的资源,全部将会被系统CloseHandle,从而关闭相关资源引用,
进程也是作为一种对象被管理,由于程序员没有调用CloseHandle,所以在进程结束后,进程占用的资源将被释放,但进程对象本身,不一定会被释放,这也解释了,为什么机器运行一段时间后,你会发现,在ring0里能看到许多已结束进程EPROCESS的,这正是进程对象没有得到释放,只有在关机时才能完全清除
从驱动角度看,打开一个对象,在驱动中只是引用了一次对象,只有第一次打开,再叫真正的打开,比如一个文件,没有打开,内存中就不存在这个文件对象,一但打开后,无论以后打开多少次,内存中只存在一个文件对象,以后的打开,只是对引用次数上的操作,
相应的,关闭,也不是真正的关闭对象句柄,只是给引用次数进行减操作
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
只有这一点代码,看不出来
看不到CompletionPort函数的实现代码
看一到主线程有没有退出
|
能力值:
( LV9,RANK:970 )
|
-
-
4 楼
LZ可以把标题改一下,这个跟完成端口没任何关系
2L应该很清楚的告诉你了。
|
能力值:
( LV12,RANK:240 )
|
-
-
5 楼
表示你不需要再对此线程进行任何操作 比如挂起 调整优先级 即可创建后立刻关闭
|
能力值:
( LV13,RANK:330 )
|
-
-
6 楼
不用就释放掉,这是好的习惯,否则,不小心很容易引起句柄泄露,将是是很郁闷的。。。
|
|
|