导航:首页 > 编程系统 > closehandle线程linux

closehandle线程linux

发布时间:2021-02-11 16:07:11

1. 创建线程是否调用CloseHandle

关于是否在创建线程后调用Closehandle一直困惑,今天查了查,才明白。 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,或者是直接用汇编,主线程退出的时候不影响其他的线程。CreateThread需要手动调用CloseHandle关闭句柄
beginthread开启的线程,在调用_endthread 时候会自动关闭句柄
beginthreadex需要手动关闭句柄如下:CreateThread、ExitThread 不适用于使用了CRT环境的C语言
_beginthread、_endthread 适用于CRT环境,但强烈建议使用ex系列函数代替(_endthread函数会直接关闭线程句柄)
_beginthreadex、_endthreadex 适用于CRT环境
AfxBeginThread、AfxEndThread 适用于MFC环境就算CloseHandle(hThread)但是这个线程没有return 之前仍然会继续运行
你CloseHandle后只是对该资源计数器进行--操作当--到0后系统将其回收

2. 【急】C++请问这段多线程代码为什么使用了CloseHandle之后在运行时Fun线程还是会运行

CloseHandle并没有关闭线程 它只是关闭了你的线程句柄 真正的是TerminateProcess()

3. 创建线程后马上CloseHandle(threadhandle)起什么作用

摘抄:我在看代码时发现,如下一段代码:
HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);
CloseHandle(threadhandle);
不明白为什么创建线程后,要马上把线程的句柄关闭,这样做的目的是什么? 这样做会杀掉线程吗? 1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。
2,所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。 计数减一而已,前提是你再不需要用这个线程句柄,这样线程结束后,资源立刻被释放。 内核对象由内核所拥有,而不是由进程所拥有。
在C l o s e H a n d l e 返回之前,它会清除进程的句柄表中的项目,该句柄现在对你的进程已经无效,不应该试图使用它。无论内核对象是否已 经撤消,都会发生清除操作。当调用C l o s e H a n d l e 函数之后,将不再拥有对内核对象的访问权,不过,如果该对象的使用计数没有递减为 0 ,那么该对象尚未被撤消。这没有问题,它只是意味着一个或多个其他进程正在使用该对象。当其他进程停止使用该对象时(通过调用C l o s e H a n d l e ),该对象将被撤消。

4. 为什么必须要使用CloseHandle关闭句柄

很多程序在创建线程都这样写的:
ThreadHandle = CreateThread(NULL,0,.....);
CloseHandel(ThreadHandle );
1,线程和线程句柄(Handle)不是一个东西,线程是在内cpu上运行的.....(说不清容楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。
2,线程句柄是一种内核对象,系统维护着每一个内核对象,当每个内核对象引用记数为0时,系统就从内存中释放该对象,CloseHandle就是将该线程对象的引用记数减1。所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。
只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。

5. CreateThread后调用CloseHandle,线程函数为什么仍在执行

CreateThread函数已经开启了线程,反回了现成的HANDLE。如果程序中不需要用到该线程的版句柄,就可以使用CloseHandle将线权程句柄释放。CloseHandle只是将句柄释放,并未将线程关闭。

6. 在对多线程调用closehandle(hsem)时,程序出错,求助!!!!

在对多线程调用closehandle(hsem)时,程序出错,求助!!!!首先提示:异常:访问内存内地址冲突 project inter.exe raised exception class eexternalexception with message 'external exception c0000008'.process stopped.use step or run to continue.然后是:容调用WINAPI出错: project inter.exe raised exception class ewin32error with message 'win32error. code:5. 拒绝访问。'.process stopped.use step or run to continue.请高手指教!

7. 请教一个线程创建后立刻用CloseHandle()函数,那么这个线程关闭了吗

没有关闭,只是关闭了它产生的句柄。线程函数ruturn才关闭,或者你TerminateThread

8. 创建线程后为什么马上调用CloseHandle来关闭句柄

ead = CreateThread( NULL, 0, ThreadFunc, NULL, 0, &dwThreadId);

CloseHandle(hThread);
如上面这样的代码,原因为:创建线程后返回了线程句柄,新创建的线内程内核对象的使用容计数是2,一个是线程本身,一个是创建线程的线程,创建线程的线程closehandle后,新的线程的内核对象使用计数为1,当这个新线程结束运行后内核对象的使用计数还要减1,这时内核对象的使用计数是0,则系统会自动删除新线程的内核对象,这是正常的处理流程。
如果不调用CloseHandle();则新线程运行结束后,由于使用计数为1,所以不会删除线程内核对象,这样就会造成内存泄漏。当然在整个程序运行结束后,操作系统会回收这些内存,因此可以知道如果不调用CloseHandle()的话,在程序运行阶段会造成内存泄漏!

阅读全文

与closehandle线程linux相关的资料

热点内容
网络中常用的传输介质 浏览:518
文件如何使用 浏览:322
同步推密码找回 浏览:865
乐高怎么才能用电脑编程序 浏览:65
本机qq文件为什么找不到 浏览:264
安卓qq空间免升级 浏览:490
linux如何删除模块驱动程序 浏览:193
at89c51c程序 浏览:329
怎么创建word大纲文件 浏览:622
袅袅朗诵文件生成器 浏览:626
1054件文件是多少gb 浏览:371
高州禁养区内能养猪多少头的文件 浏览:927
win8ico文件 浏览:949
仁和数控怎么编程 浏览:381
项目文件夹图片 浏览:87
怎么在东芝电视安装app 浏览:954
plc显示数字怎么编程 浏览:439
如何辨别假网站 浏览:711
宽带用别人的账号密码 浏览:556
新app如何占有市场 浏览:42

友情链接