CloseHandle()函数小记

最近看一段程序,在创建线程时是这样写的:

。。。。。。
HANDLE hThread = CreateThread(NULL,0,StartServProc,pServPara,0,&dwThreadId); CloseHandle(hThread);
。。。。。。

有一个疑问:这不是刚创建完线程,又关闭了吗。

查找相关资料,终于弄清楚是怎么回事,记录在此。

*******************************************************************************************************************

1. 线程和线程句柄(Handle)不是一个东西,线程是CPU上跑起来的一段程序,线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到结束,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。

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

3. 如果CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了在CloseHandle。

如果你开了一个线程,而不需要对它进行如何干预,CreateThread后直接CloseHandle就行了。

所以CloseHandle(hThread );

只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了,并没有结束该线程。该线程照常运行,直到满足条件结束。
********************************************************************************************************************

CreateThread函数原型:

HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,      //SD
    SIZE_T dwStackSize,                            //initialstacksize
    LPTHREAD_START_ROUTINE lpStartAddress,         //threadfunction
    LPVOID lpParameter,                            //threadargument
    DWORD dwCreationFlags,                         //creationoption
    LPDWORD lpThreadId                             //threadidentifier
)

参数:

lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE

dwStackSize:设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。

lpStartAddress:指向线程函数的指针。

lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。

dwCreationFlags :线程标志,可取值如下:

(1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,

(2)0:表示创建后立即激活。

(3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize参数指定初始的保留堆栈的大小,否则,dwStackSize指定提交的大小。

lpThreadId:保存新线程的id。

返回值:

函数成功,返回线程句柄;函数失败,返回NULL。

------------------------------------------------------------------------------------

CloseHandle函数原型:

BOOL CloseHandle(HANDLE hObject);

参数:

hObject :代表一个已打开对象的handle。

返回值:

TRUE:执行成功;

FALSE:执行失败,可以调用GetLastError()获知失败原因。

 

转载于:https://www.cnblogs.com/AlexBai/p/9135215.html

CloseHandle()函数的使用 CloseHandle()函数的使用??很多程序在创建线程都这样写的:............ThreadHandle = CreateThread(NULL,0,.....);CloseHandel(ThreadHandle );。。。。。这不是刚好创建又关闭了吗?线程怎么运行呢?================================================Closin 阅读详情

相关推荐

C++ 中CloseHandle 函数–关闭一个句柄

CloseHandle函数 作用 关闭一个打开的对象句柄。 语法 BOOL WINAPI CloseHandle( _In_ HANDLE hObject ); 参数 hObject   已经打开的有效对象句柄。 返回值 如果函数操作成功,返回值为非零值 如果函数操作失败,返回值为零。 注意: (1)句柄不应该被关闭两次; (2)可以关闭的句柄有控制台输入、控制台屏幕缓冲区等。 头文件 Winbase..h(包括Windows.h) 参考来源:来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724

CloseHandle(),TerminateThread(),ExitThread()的区别

线程的handle用处: 线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问。该内存块是一种数据结构,它的成员负责维护对象的各种信息(eg: 安全性描述,引用计数等)。 CloseHandle() 在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandl

记事本 1543

closehandle()函数

引用自《百度百科》,用于解决今天遇到的close handle 后什么时候释放资源问题:     方法名称:CloseHandle 位置:Kernel32.dll BOOL CloseHandle( HANDLE hObject ); 参数 hObject :代表一个已打开对象handle。 返回值 TRUE:执行成功; FALSE:执行失败,可以调用GetLastErro...

u011555996的博客 2574

CreateProcess启动进程后,最好CloseHandle(pi.hProcess);CloseHandle(pi.hThread);

通过CreateProcess启动进程,记录pi.dwProcessId; 然后通过OpenProcess判断此进程是否结束。感觉没有什么错误。跑了一下发现,在任务管理器中结束被启动的进程后,OpenProcess照样能获得进程句柄,但在任务管理器中此进程确实不存在了。考虑到进程句柄是一个内核对象。内核对象有引用计数,引用计数为0后才会销毁,OpenProcess会使其引用计数增1。所以...

afdd28617的博客 1812

详细解析CloseHandle()

书籍:《Visual C++ 2017从入门到精通》的2.9环境:visual studio 2022内容:[例 2.52] 文件API函数简单应用以下是。

felicity_one的博客 1335

线程中 CloseHandle()函数的使用

为什么80%的码农都做不了架构师?>>> ...

weixin_33908217的博客 365

关闭线程句柄CloseHandle()

昨天在看老工程中的代码的时候,发现其中创建了一个线程后,并没有通过CloseHandle函数来关闭该句柄。抱着怀疑的态度,就查了些相关的资料,现把自己的调查结果总结如下。 1、创建线程 可以通过调用CreateThread函数来创建一个线程,函数原型如下: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpsa, DWORD cbStack, LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpvThrea...

积微成著 5766

CloseHandle()函数的使用缘由

CloseHandle()函数的使用?? 很多程序在创建线程都这样写的: ............ ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle ); 。。。。。 这不是刚好创建又关闭了吗?线程怎么运行呢? ========================================

qq_30959709的博客 467

句柄泄露与CloseHandle()

摘自:http://blog.chinaunix.net/uid-21783276-id-2689047.html CloseHandle()函数的使用?? 很多程序在创建线程都这样写的: ............ ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle ); 。。。。。 这不是刚

chinaclock的专栏 5059

关于CreadThread()CloseHandle()

今天看了点关于Windows多线程的东西,摘抄点关于CloseHandle的内容放于此,以便以后参考。 主要是《Windows核心编程》里的两小节: 3.1.1 内核对象的使用计数 内核对象由内核所拥有,而不是由进程所拥有。换句话说,如果你的进程调用了一个创建内核对象...

493

CloseHandle()函数

关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。 若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程

ghevinn欢迎您光临 1898

CloseHandle()的作用

CloseHandle(),线程,线程句柄

Jiangislogining的博客 1982

C++中CloseHandle()函数的使用

转自:http://blog.csdn.net/lhsxsh/article/details/3905505 很多程序在创建线程都这样写的: ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle ); 这不是刚好创建又关闭了吗?线程怎么运行呢? 解释: Closing a thread

GVFDBDF的专栏 5203

closehandle

CloseHandle()函数的使用??很多程序在创建线程都这样写的:............ThreadHandle = CreateThread(NULL,0,.....);CloseHandel(ThreadHandle );。。。。。这不是刚好创建又关闭了吗?线程怎么运行呢?================================================Clos

王孙贵族的专栏 1997
上一篇: 内存对齐以及如何按任意字节内存对齐
下一篇: 设置控制台应用程序运行时隐藏控制台
anzhi3313
博客等级 码龄10年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值