比如,某程序中启动一个线程,ping网络中的某个主机,因为某些特殊需要,使用了new,申请一片内存,ping的实现用的是sock的阻塞模式。
那么,在程序结束的时候,可能线程仍然处于阻塞状态,但是又不能强制结束,请问大家是如何处理的。我先说说我的做法,
为每个线程建立一个结构体,保存线程需要申请的各项资源的指针,线程强制结束,然后在主线程中释放资源。
但是我觉得这个方法不好,各位都来谈谈有没有别的方法。
那么,在程序结束的时候,可能线程仍然处于阻塞状态,但是又不能强制结束,请问大家是如何处理的。我先说说我的做法,
为每个线程建立一个结构体,保存线程需要申请的各项资源的指针,线程强制结束,然后在主线程中释放资源。
但是我觉得这个方法不好,各位都来谈谈有没有别的方法。
1、我在线程中New了内存
2、线程可能被强制结束(可能是线程阻塞,也可能是死循环,也可能是程序要结束了,要求线程立刻结束,原因不管了,反正下面的资源释放代码是执行不到)
那么,new的内存必须是要释放的。在这种情况下大家是怎么处理的?
中“下面的资源释放代码”指线程中的位于未尾的,用于释放线程中new的内存(其实还有其它的资源)的代码
{
bool bKeepRunning == TRUE;
while(bKeepRunning )
{
//process something...
if(WaitForSingleObject(eventKill.m_hObject, 0) == WAIT_OBJECT_0)
{
//release memory
bKeepRunning = FALSE;
}
}
return 0;
}
///这样行么?
……
//process something...
……
如果在这process something的时候,出现线程阻塞,甚至死循环,那么要结束线程只能强制结束了,用TerminateThread()
那么下面的
if(WaitForSingleObject(eventKill.m_hObject, 0) == WAIT_OBJECT_0)
{
//release memory
bKeepRunning = FALSE;
}
又怎么能够执行到呢?
{
if( Ping() )//返回了值
SetEvent( handle );
}WaitThread
{
....
int nRet = WaitForsingleObject( handle.....)
if( nRet)
.....
}main()
{
.....
if( ShouldStop() )
{
beginthread( WaitThread.....)
}
}
象这样的问题,我看就按楼主的办法了
最好用map,如果把序号抱给表。
用的时候,去查出来再用。(共箱数据要锁好)
主线程杀完线程,顺便从表中杀了该结构。