现在的位置: 首页 > 综合 > 正文

关于线程的句柄资源

2018年02月09日 ⁄ 综合 ⁄ 共 2617字 ⁄ 字号 评论关闭

一例子1 

    if(sClient!=INVALID_SOCKET)

   {

    hThread = CreateThread(NULL,0,ClientThread,(LPVOID)pClientInfo,0,&dwThread);

    //free(pClientInfo);

    if(hThread==NULL)

    {

     AfxMessageBox("Thread Creat Failed!\n");

     break;

    }

        CloseHandle(hThread);

   }



        CloseHandle关闭句柄并没有终止新创建的线程。只是表示对新创建的线程的引用不敢兴趣,系统会递减新 线程的线程内核对象的使用计数。当使用计数为0的时候,系统就会释放线程内核对象。如果在主线程中没有关闭线程的句柄,始终都会保留一个引用。这样线程内核对象的引用计数就不会 为0。即使新线程执行完毕,线程内核对象也不会被释放,只有等到进程终止的时候系统才会为 残留的对象做清理工作。所以应该在不再使用线程的句柄的时候将其关闭掉,让线程的线程内核对象的引用计数减1 

Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, and then close all handles to the thread. 

MSDN上的一句话! 


主线程没有任何特殊性,主线程退出并不会导致它所创建的线程退出! 


在Windows上,所有的线程都是平等的,其实没有什么主线程和和从属线程的区别。你可能会说:你说的不对,我的主线程结束了,我的程序就退出了。这是因为我们大部分的程序都是Link了微软的CRT,主函数由它导入,当main函数结束的时候,CRT会叫到: 


ExitProcess 


于是所有的线程都同归于尽了。你感觉上好像其他线程都是主线程给弄没的。如果你不用CRT,或者是直接用汇编,主线程退出的时候不影响其他的线程。

一例子2
............

ThreadHandle = CreateThread(NULL,0,.....);

CloseHandel(ThreadHandle );

。。。。。

这不是刚好创建又关闭了吗?线程怎么运行呢?


================================================


Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.


================================================


1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。


2,所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。


3,如果你CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了在CloseHandle。如果你开了一个线程,而不需要对它进行如何干预,CreateThread后直接CloseHandle就行了。



所以

CloseHandel(ThreadHandle );

只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。


如果你觉得多了一个变量,也可以写为:

CloseHandel(CreateThread(NULL,0,.....));


================================================================


《windows核心编程》上说调用closehandle(HANDLE)表示创建者放弃对该内核对象的操作。如果该对象的引用对象记数为0就撤消该对象。



====================================================================


在线程创建后马上调用CloseHandle()是个良好的做法,这里不会影响线程的执行,就是因为即使你close了这个handle,它的内部记数也不为零.    但如果你不关,在线程结束后,那个线程对象将滞留于内存中,也就是说你有handle    leak.  

   

   返回这个handle给你,是让你有机会对这个线程实施外部动作,诸如waitforsingleobject之类.  


==================================================================


CloseHandle的功能是关闭一个打开的对象句柄,该对象句柄可以是线程句柄,也可以是进程、信号量等其他内核对象的句柄,而ExitThread的功能是终止一个线程,它所接受的参数是一个线程的退出码。  

   

   通过调用CloseHandle可以告知系统,已经完成了对某一内核对象的操作,该函数首先检查调用进程的句柄表,来确认进程是否对该句柄所指向的对象有访问权,如果句柄无效则返回FALSE,如果有效,系统将得到该内核对象的数据结构的地址,把结构中的使用计数成员减1,如果计数变为0,则将从内核中释放该内核对象。  

   

   如果计数还未到0,就意味着还有其他的进程在使用这个内核对象,那么它就不会被释放。  

   

   ExitThread是推荐使用的结束一个线程的方法,当调用该函数时,当前线程的栈被释放,然后线程终止,相对于TerminateThread函数来说,这样做能够更好地完成附加在该线程上的DLL的清除工作。  

【上篇】
【下篇】

抱歉!评论已关闭.