比如,某程序中启动一个线程,ping网络中的某个主机,因为某些特殊需要,使用了new,申请一片内存,ping的实现用的是sock的阻塞模式。
那么,在程序结束的时候,可能线程仍然处于阻塞状态,但是又不能强制结束,请问大家是如何处理的。我先说说我的做法,
为每个线程建立一个结构体,保存线程需要申请的各项资源的指针,线程强制结束,然后在主线程中释放资源。
但是我觉得这个方法不好,各位都来谈谈有没有别的方法。

解决方案 »

  1.   

    程序结束的时候,线程不是也被杀了么?WaitFor....
      

  2.   

    用两个线程,一个用于控制,closesocket(..);
      

  3.   

    问题就在于
    1、我在线程中New了内存
    2、线程可能被强制结束(可能是线程阻塞,也可能是死循环,也可能是程序要结束了,要求线程立刻结束,原因不管了,反正下面的资源释放代码是执行不到)
    那么,new的内存必须是要释放的。在这种情况下大家是怎么处理的?
      

  4.   

    “反正下面的资源释放代码是执行不到”
    中“下面的资源释放代码”指线程中的位于未尾的,用于释放线程中new的内存(其实还有其它的资源)的代码
      

  5.   

    UINT ThreadProc(LPVOID pParam)
    {
        bool bKeepRunning == TRUE;
        while(bKeepRunning )
        {
           //process something...
           if(WaitForSingleObject(eventKill.m_hObject, 0) == WAIT_OBJECT_0)
           { 
              //release memory
              bKeepRunning = FALSE;
           }
        }
        return 0;
    }
    ///这样行么?
      

  6.   

    回复人: lq100() ( ) 信誉:100 
    ……
    //process something...
    ……
    如果在这process something的时候,出现线程阻塞,甚至死循环,那么要结束线程只能强制结束了,用TerminateThread()
    那么下面的
    if(WaitForSingleObject(eventKill.m_hObject, 0) == WAIT_OBJECT_0)

              //release memory
              bKeepRunning = FALSE;
    }
    又怎么能够执行到呢?
      

  7.   

    Thread1( void* p)
    {
       if( Ping() )//返回了值
          SetEvent( handle );
    }WaitThread
    {
        ....
        int nRet = WaitForsingleObject( handle.....)
        if( nRet)
          .....
    }main()
    {
       .....
       if( ShouldStop() )
       {
          beginthread( WaitThread.....)
       }
    }
      

  8.   

    进程结束系统会自动清除你所分配的内存和内核对象。所以你的结束后不用担心new出来的内存,会自动回收的。
      

  9.   

    进程结束系统会自动清除你所分配的内存和内核对象。所以你的结束后不用担心new出来的内存,会自动回收的。??C又有了新特性了,不会吧。我记得New出来的内存是不会被自动释放的
      

  10.   

    kvls(冰茶) 说得太不负责任了
    象这样的问题,我看就按楼主的办法了
      

  11.   

    在主线程中,做个表把所有的结构管起来。
    最好用map,如果把序号抱给表。
    用的时候,去查出来再用。(共箱数据要锁好)
    主线程杀完线程,顺便从表中杀了该结构。