关于线程的句柄资源
来源:互联网 发布:python 约瑟夫环 编辑:程序博客网 时间:2024/06/05 04:43
一例子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的清除工作。
- 关于线程的句柄资源
- 线程(进程)的句柄与伪句柄
- 资源模块句柄的切换
- 资源模块句柄的切换 .
- 关于句柄的基础知识
- 关于文件的句柄
- 关于句柄的概念
- 线程、线程句柄、线程ID的关系
- 线程、线程句柄、线程ID的关系
- 由CloseHandle()函数引发的关于线程和线程句柄的一些解释
- 关于进程句柄 窗口句柄的关系
- 关于进程和线程以及句柄
- 关于进程和线程以及句柄
- 线程的句柄和标识符
- 线程句柄和线程ID的区别
- 线程ID与线程句柄的关系
- 如何监控Windows进程的句柄资源
- php数据库连接的资源句柄问题
- Android测试教程(17):Monkey 命令行工具
- xAd:南京大学大二学生开发的视频内广告动态植入技术
- 黑链-最高明的网站隐藏链接方法
- Android ApiDemos示例解析(12):App->Activity->Redirection
- 用链接标签触发onclick事件而不跳转
- 关于线程的句柄资源
- apache 多端口设置
- unix高级编程之-命令行参数(实践一)
- LDA,pLSA等图像分类的生成模型
- 通过预计算提高GIS服务性能
- SqlHelper类详解
- 增加VMware虚拟机的磁盘空间
- 6410修改键盘驱动 自定义6*5矩阵键盘
- page70