AfxBeginThread和AfxEndThread+内存泄露
ref
http://blog.csdn.net/kut00/article/details/4209680
启动线程:
CWinThread* AfxBeginThread( 线程函数, this );
线程的退出:在刚刚使用的时候,退出线程的方法有问题,导致退出的时候异常。
下面说线程退出的方法:
1. 线程函数返回:线程都在死循环中,当满足一定条件时, return ,也会将线程结束。
2. AfxEndThread:这个函数只能用在线程函数中,当满足一定条件是,调用。
举一个例子:
可以创建一个信号量,用 WaitForSingleObject 函数来检测该信号量的状态。
成员变量 m_hThreadEvent;m_hThreadEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
线程的执行函数:
for ( ; ; )
{
DWORD dwRetVal;
dwRetVal = WaitForSingleObject( m_hThreadEvent, 100 );
if ( dwRetVal == WAIT_TIMEOUT )
{
// TODO:
}
else
{
DWORD dwExitCode; // stop receive text thread.
GetExitCodeThread( m_pThreadRecv->m_hThread, &dwExitCode );
AfxEndThread( dwExitCode, TRUE );
}
}
要结束线程时,使用 SetEvent ,将信号量置为有信号。 该线程是在信号量有信号时,退出。
3. TerminateThread:在 CWinThread 对象中有线程的句柄,可以使用该句柄强行杀死线程。但是不推荐使用这种方式,当可以正常结束的时候,选择前两种方法较好。
http://hi.baidu.com/reversefish/item/37a07243fdf2da95823ae1af
AfxBeginThread引起的内存泄漏
AfxBeginThread引起的内存泄漏(ZZ)
下面的代码,当用AfxBeginThread开始一个线程时,实际上是有内存泄漏的
for (ii = 0 ; ii < 1000 ; ii ++ )
{
CWinThread * pWinThread;
pWinThread = AfxBeginThread(ThreadLBProc, NULL);
::Sleep( 500 );
}
UINT ThreadLBProc(LPVOID pParam)
{
return 0 ;
}
VC输出的典型提示为:
Detected memory leaks!
Dumping objects ->
thrdcore.cpp(166) : {782} client block at 0x00425300, subtype 0, 112 bytes long.
实际上,只要看到是thrdcore.cpp(166) 的内存泄漏,基本就是同一个原因,和上面的代码一样。
解决方法:
step 1)
在线程函数中,记得写AfxEndThread();(与AfxBeginThread对应,其他的开始线程的函数,有相应的函数)
step 2)
用::WaitForSingleObject()确保线程彻底退出
step 2是比较容易忽略的,用sleep函数只能侥幸的保证线程退出,但不能确保。
最新文章
- python之消息队列
- PHP就业班心得:PHP的基本含义与功能特点
- Hybrid框架UI重构之路:六、前端那点事儿(Javascript)
- PHP中逻辑运算符and/or与||/&;&;的一个坑
- 阿里云服务器 &;&; 如何window链接到阿里云服务器
- 虚拟机安装Mac OS X ----- VM12安装Mac OS X
- iOS-CAEmitterLayer(粒子效果)
- MVC @Html.DropDownListFor 默认值
- js模块,类,继承,命名空间,私有属性等相关概念梳理
- php5.5 yum源
- Errors occurred during the build. Errors running builder &#39;DeploymentBuilder&#39; on project &#39;项目名&#39;
- TCP 连接的建立和终止
- Java中的事务——JDBC事务和JTA事务
- .NET 4 并行(多核)编程系列之四 Task的休眠
- 将JSON映射为实体对象(iOS篇)
- Redis源码 - 事件管理
- Some Interesting Problems(持续更新中)
- Vijos.lxhgww的奇思妙想(k级祖先 长链剖分)
- Linux学习笔记14—文件的压缩与打包
- rman checksyntax和解决RMAN-01009: syntax error: found ";dot";