VC++关闭线程的问题

一、VC中可以用如下方法创建一个线程:

CWinThread *pThread = AfxBeginThread(ThreadFunc , &ThreadInfo);
返回值: 一个指向新线程的线程对象


终止一个线程可以有两种方式:

1、当工作者线程执行一个返回语句时,线程终止。

2、调用AfxEndThread()时,工作者线程就会终止。


线程的执行状态可以用下面的函数来获取线程的退出码:

DWORD dwExitCode;
::GetExitCodeThread(pThread->m_hThread, &dwExitCode);
当线程仍然执行时,::GetExitCodeThread() 函数会把dwExitCode置为STILL_ACTIVE。

但是如果该线程被终止,CWindThread对象默认自动删除它自己,因此GetExitCodeThread()函数就会访问无效的pThread。解决这个问题可以通过如下设置来解决:

pThread->m_bAutoDelete = FALSE;

这种方式需要手动删除句柄:

CloseHandle(pThread->m_hThread);
否则会造成内核对象的泄露!!


删除内核对象句柄:

关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。

若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。

如上节所示:如果该线程被终止,CWindThread对象默认自动删除它自己,因此如果没有设置m_bAutoDelete = FALSE ,直接在线程结束后调用CloseHandle()就会造成空句柄错误!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值