线程退出的问题 我写了一个多线程程序,调试发现线程函数已经正常返回,但是在主线程join 等待线程结束还是返回timeout,不知道啥缘故 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WatiForSingleObject(hThread, INFINITE); 如果你是afxbegingthread在线程退出之前在线程里面调用一下afxendthread. 死锁问题用WatiForSingleObject,再用TermiateThread()干掉它 超时返回?你是不是用了WatiForSingleObject等一些等待函数啊,如果是那么你线程结束前,设置了等待的东西没哟(比如用SetEvent设置事件,让WatiForSingleObject返回) 我有waitforsingleobject 等待线程句柄,返回超时,并且可以确认的是线程函数已经返回 我用_beginthreadex 创建 线程,在线程函数返回的地方执行_endthread 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; }创建 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; } 原因查明,是因为我再atexist里面停止的线程,如果我在代码中显式的停止线程就不会有这个问题,但是底层的原因还是不明了,并且我的程序因为牵扯到很多模块,所以不得已才在atexit当中调用,所以请问高手有什么办法避免这个问题呢 你用了WatiForSingleObject等一些等待函数吧,如果是那么你线程结束前,设置了等待的东西没哟 建立个线程退出事件 event线程WaitForSingleObject(event,0)如果等到就 break 退出这样你想退出线程 EetEvent(event)就可以了 感觉LZ使用线程的习惯似乎与本人很是不同,而且LZ的代码我也没看太明白,atexit也不知是什么东东。所以不好说什么了。 关键是我的模块是出于最底层,被很多不同的模块调用,用的是显式load,有的是隐式,所以不得已在atexist里面注册了清理函数。感觉这个函数是在process detach里面运行的,这个时候线程状态已经很怪异了, 所以使用waitsingleobject并不能得到函数的退出状态 if()括号里面能加 #define定义的数吗 一个简单实用的串口操作类 请人编界面,有报酬 VC6中如何播放mp3文件 请问一个VC资料哪里有下载的。。。。 辞职了,终于松了口气!!! 求助一个简单的串口通信方面的activex控件的源代码 一个很简单的问题关于映射的?? 难道没有人能解决这个问题吗?——一个关于存档CSOCK的问题,非常伤脑筋。(200分!!!) 当插入u盘时如何让u盘使用你指定的盘符,而不是系统自动加载的盘符 MFC 捕获窗口显示,在线等!!!!! CMapStringToString的相关问题
用WatiForSingleObject,再用TermiateThread()干掉它
你是不是用了WatiForSingleObject等一些等待函数啊,如果是那么你线程结束前,设置了等待的东西没哟(比如用SetEvent设置事件,让WatiForSingleObject返回)
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;
}创建
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;
}
线程WaitForSingleObject(event,0)
如果等到就 break 退出
这样你想退出线程 EetEvent(event)就可以了