有几个小问题请教下大家
1:主线程里开个子线程,现在假如主线程要退出了,但是子线程还在跑,这时候是否需要去关闭子线程?是直接让主线程退出还是waitforsingleobject(子线程)?我觉得可以不去关闭子线程,因为主线程是正常退出,进程也就结束了,进程所占有的所有资源都被OS回收,理论上也就无所谓的资源泄露。
2:如果要关闭子线程,常用的手法无非是用个全局变量或者信号量事件等去通知子线程,让其结束,那waiteforsingleobject一般等待多久合适?久了影响体验,短了可能线程还没结束。
3:还是上一个问题,假如子线程调用了一个第三方的DLL导出函数,这个函数一直没返回,这时候主线程要退出了,子线程要怎么退出呢?TerminateThread?waitforsingleobject肯定不合适,还是说不管了,直接让主线程退出。
如果碰到这些情况大家一般怎样处理?在线等。

解决方案 »

  1.   

    1.
    不是硬件资源都可以不用管, 直接退出.
    确切说, 只要是用句柄引用的资源和占用的物理内存, 系统都会帮忙回收.
    其他的需要自行释放.2.
    你可以把所有窗口都销毁了.
    等子线程响应.
    使程序似乎退出了,
    只要不去看任务管理器.3.
    没好的办法.
    或许你可以尝试用 SetThreadContext 这种非常规手段来更改线程的执行.
      

  2.   

    哦 我想多了 如果只是这么简单的需求.
    直接ExitProcess就可以了.
      

  3.   

    最好是主线程退出之前,所有的子线程先return返回
      

  4.   

    回5L:你说的是异步通知子线程退出吗?
    回6L:通知子线程退出,但是子线程调用某个函数,这个函数一直没返回,这种情况下怎么让其退出?一直等吗?前提是这个函数是第三方提供的。
    回7L:请教下所谓的标志位是不是让子线程去检测某个变量,当发现变量改变时就让子线程return退出?这种办法也没用。另外“增加子线程强制退出的方法”具体有哪些?不会是exitthread,termiantethread这些吧
    回8L:。大哥能否对我的提问指点下。
      

  5.   

    回楼上,就像问题三里说到的,子线程里调用了第三方DLL导出的函数,这个函数很长时间没返回,在这个函数还没返回的时候,是不是只能强制线程退出?
      

  6.   

    自己顶下,现在就碰到这样的问题。开个线程,调用别人写的DLL导出个函数,这个函数执行完大概要20多秒,现在如果要结束这个线程是不是只能暴力结束?
      

  7.   

    加个bFlag啊,你那个循环时就靠它来支撑的
    只要需要时候把他设为false不会算是暴力的
      

  8.   

    DLL不是我写的也没有源码,就调用这导出的函数,没有循环,函数就调用一次,一次就20多秒,往哪加bFlag?现在逼的只能TerminageThread了,以前从没这么干过,都老老实实的让其自然退出,现在心里总不踏实。大家有没有碰到这样的情况?有的话一般怎么做的
      

  9.   

    1、印象中,现在主线程挂了,但是如果还有别的线程再跑,进程还会存在吧……
    3、这个,你调用DLL中函数的过程是什么?能改改不?能改就在这里加flag
      

  10.   

    贴个例子:DWORD __stdcall mythread(void* )
    {
        while( true )
        {
            char* p = new char[1024];        delete p;
        }
    }int _tmain(int argc, _TCHAR* argv[])
    {    HANDLE h = CreateThread(NULL, 0, mythread, NULL, 0, NULL);    Sleep(1000);    TerminateThread(h, 0);
        h = NULL;    char* p = new char[1024]; //这里会死锁,过不去    delete p;    return 0;
    }exitprocess================>terminatethread不稳定http://shfzhzhr.iteye.com/blog/1106983
      

  11.   

    主线程自然退出进程会退出,windows核心编程上有提到。主线程异常退出,进程未必会退出,这句话我没在书上看过,听坛子里的高手说过。17L的代码看过,大概意思是内存分配有加锁,干掉子线程,有可能没有把锁释放,所以主线程阻塞住了。没碰到过这种情况,理论上好想有点成立,实际不知道。6L说的异步估计是个什么事件或者信号量,但这种情况下貌似没用。
      

  12.   

    没听说过 异步可以让线程可以退出?如果可以,似乎也是通过postThreadmessage的法子吧, 但是你采用异步的法子让其退出,难道主线程不需要等待嘛?退出也是需要时间的。既然如此, 异步或者不异步,有意思吗?
    另外:我在win32多线程上看到的,没听说过主线程异常退出, 子线程还在。进程还在的话。不知道谁给可以提供一个例子,试验一下,我觉得 拿书上的话来吓唬人,没意思。提供例子,验证才是正道!!
      

  13.   

    最好在主线程按照业务逻辑,正常退出各子线程,
    HANDLE m_OsisObj[2];
    m_OsisObj[0]=log->m_hSemaphore;
    m_OsisObj[1]=log->m_hExitEvent;
    dRet=WaitForMultipleObjects(2,m_OsisObj,FALSE,INFINITE);
      

  14.   

    简单的话 在主线程中 WaitForSingleObject(hThread,INFINITE);