您的位置:程序门 -> c/c++ -> c++ 语言



用createthread生成线程后,怎么样才算完全清理干净.


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


用createthread生成线程后,怎么样才算完全清理干净.[已结贴,结贴人:pgmsoul]
发表于:2007-09-18 08:39:09 楼主
书上说线程执行的函数返回是结束线程最好的形式,或者在线程内执行exitthread.但是这种情况下,有没有必要调用closehandle呢?原则上,不调用的话,肯定有相应的资源仍然被占用,比如即使线程正常结束,我们仍然可以调用getexitcode函数来获取线程的返回值,而不管这个线程已经结束多长时间.但是这个closehandle我看大多数人并不调用它,怎么样才算完全释放了一个线程的全部资源呢.
发表于:2007-09-18 08:47:331楼 得分:0
一般要closehandle
不调用   程序执行完   也会释放
发表于:2007-09-18 08:48:302楼 得分:0
假如使用c++   那么记得用beginthread或者beginthreadex来启动线程
通常在线程内部return就可以了,不要调用endthread之类的函数.
发表于:2007-09-18 08:57:533楼 得分:0
我极少调用c++的库函数,基本上用api来完成.线程还是很占资源的,一个程序要是频繁的启动线程,还是希望能清理干净.
发表于:2007-09-18 09:12:584楼 得分:0
需要closehandle。
发表于:2007-09-18 10:14:305楼 得分:0
话说回来,什么时候调用closehandle很是问题.一定要等到线程结束,因为closehandle对线程的执行没有任何影响,如果之前调用,会失去线程的句柄的有效性,这不太合适.要想知道线程是否已经结束,可以用一个waitforsingleobject,但这是一个等待函数,会阻塞执行线程.如果再启用一个线程来执行这个等待函数(在它的后面调用closehandle),系统开销也太大了.
发表于:2007-09-18 10:24:066楼 得分:0
设置一个全局的handle的数组,等到数组元素满到一大半的时候,专门开一个线程,waitforsingleobject关闭一系列的handle,我看就行了吧?
发表于:2007-09-18 10:53:287楼 得分:0
如果是使用createthread创建的线程,那么必须在线程结束后(waitforsingleobject确保线程已退出)调用closehandle才能清理干净。
如果这个线程会非常频繁的开启关闭,建议还是在线程里面写个循环好了,线程开启时先等待某个信号量,处理完一次流程后回到起点,而它因为得不到信号量,就会被系统挂起。下次要调用它的时候在主线程增加这个信号量就可以了。
发表于:2007-09-18 11:22:028楼 得分:0
没明白lz的意思。。。

假设线程a调用createthread,创建线程b之后,会得到一个描述该线程的handle,如果线程a不需要对线程b进行什么操作,那么a在createthread返回之后马上调用closehandle,这样不会对b造成任何影响。如果a需要这个handle,那就先不要closehandle,等到a不需要了再closehandle就可以了,这也不会有什么问题。至于lz说到调用时机的问题,如果a一定要等到b结束再调用closehandle,那么除了使用某种同步策略也没有什么更好的办法,因为你有这样的需求,你就要承担这样的“代价”
发表于:2007-09-18 11:23:529楼 得分:10
closehandle   释放的是内核对象资源(它大概就是一个结构体,里面内核对象的一些信息,不会很大),而不是你在线程里申请的内存。
强制结束线程主要考虑的是你在线程申请的内存,比如你在线程里动态申请了2m内存,那你就要想办法在强制结束线程把这2m内存释放掉。
这2m内存的释放根closehandle没关系。
发表于:2007-09-21 12:34:1910楼 得分:10
做个简单的试验就知道了:
thread1:
for(int   i=0;i <100000;i++)
{
handle   h   =   createthread(0,0,(lpthread_start_routine)fun,0,0,0);
waitforsingleobject(h,0xffffffff);
closehandle(h);
}
thread2:
for(int   i=0;i <100000;i++)
{
handle   h   =   createthread(0,0,(lpthread_start_routine)fun,0,0,0);
//waitforsingleobject(h,0xffffffff);
//closehandle(h);
}
ctrl+alt+del打开任务管理器,看资源的使用情况,事实证明closehandle是必要的
发表于:2007-09-21 12:40:4611楼 得分:0
如果不是要显式的等待线程结束,createthread调用完后,直接closehandle就好了。关了句柄又不影响线程的执行。
发表于:2007-10-03 06:17:1312楼 得分:0
lzgmfc:真正影响资源占用的是waitforsingleobject,如果不等待,下一个线程就会启动,同时会有多个线程在执行,所以占用的资源会多,但我测试时,只多了一点,或者是因为线程函数太简单.closehandle调不调用至少在任务管理器,资源占用情况一样.我的程序只占用了,500多k到600多k内存,虽然启动了那么多的线程.相对一般的程序,还是很小的.


快速检索

最新资讯
热门点击