我写了一个多线程程序,调试发现线程函数已经正常返回,但是在主线程join 等待线程结束还是返回timeout,不知道啥缘故

解决方案 »

  1.   

    WatiForSingleObject(hThread, INFINITE);
      

  2.   

    如果你是afxbegingthread在线程退出之前在线程里面调用一下afxendthread.
      

  3.   

    死锁问题
    用WatiForSingleObject,再用TermiateThread()干掉它
      

  4.   

    超时返回?
    你是不是用了WatiForSingleObject等一些等待函数啊,如果是那么你线程结束前,设置了等待的东西没哟(比如用SetEvent设置事件,让WatiForSingleObject返回)
      

  5.   

    我有waitforsingleobject 等待线程句柄,返回超时,并且可以确认的是线程函数已经返回
      

  6.   

    我用_beginthreadex 创建 线程,在线程函数返回的地方执行_endthread
      

  7.   

    m_Handle = (HANDLE)::_beginthreadex(
    NULL,
    0,
    ThreadProc,
    this,
    0,
    (unsigned int *)(&m_Tid));
    if (m_Handle == 0) {
    CM_ERROR_TRACE_THIS("ACmThread::Create, _beginthreadex() failed! err=" << errno);
    return CM_ERROR_UNEXPECTED;
    }创建
      

  8.   

    ACmThread *pThread = static_cast<ACmThread *>(aPara);
    CM_ASSERTE_RETURN(pThread, NULL); pThread->OnThreadInit();
    if (pThread->m_Type != CCmThreadManager::TT_MAIN) {
    CM_ASSERTE(pThread->m_pEvent4Start);
    if (pThread->m_pEvent4Start)
    pThread->m_pEvent4Start->Signal();
    } pThread->OnThreadRun(); if (CM_BIT_DISABLED(pThread->m_Flag, CCmThreadManager::TF_JOINABLE) && 
    ++pThread->m_NeedDelete >= 2)
    {
    delete pThread;
    }#ifdef CM_WIN32
    ::_endthread(); // 已经执行
    #endif // CM_WIN32
    return NULL;
    -----------------
    DWORD dwRet = ::WaitForSingleObject(m_Handle, 100);
    if (dwRet == WAIT_OBJECT_0)
    return CM_OK;
    else if (dwRet == WAIT_TIMEOUT) {
    CM_WARNING_TRACE_THIS("ACmThread::Join, WaitForSingleObject() timeout!"); //总是到这里
    TerminateThread(m_Handle, 123);
    return CM_ERROR_TIMEOUT;
    }
    else {
    CM_ERROR_TRACE_THIS("ACmThread::Join, WaitForSingleObject() failed! err=" << ::GetLastError());
    return CM_ERROR_FAILURE;
    }
      

  9.   

    原因查明,是因为我再atexist里面停止的线程,如果我在代码中显式的停止线程就不会有这个问题,但是底层的原因还是不明了,并且我的程序因为牵扯到很多模块,所以不得已才在atexit当中调用,所以请问高手有什么办法避免这个问题呢
      

  10.   

    你用了WatiForSingleObject等一些等待函数吧,如果是那么你线程结束前,设置了等待的东西没哟
      

  11.   

    建立个线程退出事件 event
    线程WaitForSingleObject(event,0)
    如果等到就 break  退出
    这样你想退出线程  EetEvent(event)就可以了
     
      

  12.   

    感觉LZ使用线程的习惯似乎与本人很是不同,而且LZ的代码我也没看太明白,atexit也不知是什么东东。所以不好说什么了。
      

  13.   

    关键是我的模块是出于最底层,被很多不同的模块调用,用的是显式load,有的是隐式,所以不得已在atexist里面注册了清理函数。感觉这个函数是在process detach里面运行的,这个时候线程状态已经很怪异了, 所以使用waitsingleobject并不能得到函数的退出状态