首页
社区
课程
招聘
[求助]完成端口创建工作中线程的疑问。。。
发表于: 2009-12-21 11:35 5735

[求助]完成端口创建工作中线程的疑问。。。

2009-12-21 11:35
5735
各位牛人,我是新手,想请教个问题,最近学习完成端口,但是看了好多资料,根据系统CPU创建工作者线程数量,可是为什么创建完后就关闭了?很纳闷,代码如下。
153     for(int i = 0; i < SystemInfo.dwNumberOfProcessors * 2; i++)
154      {
155          HANDLE hProcessIO = CreateThread(NULL, 0, ProcessIO, CompletionPort, 0, NULL);
156         //if(hProcessIO)
157          CloseHandle(hProcessIO);
158      }

155行创建线程,为什么157行就給关闭了???谢谢

明白了,谢谢2楼choday讲的那么清楚。关闭线程句柄并不代表结束线程,只是不用再对线程再其它操作而已,而且也可以不用特意去关闭,进程结束线程就会释放,谢谢!

[课程]Linux pwn 探索篇!

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