线程退出的问题

victor_cui 2010-04-23 06:02:14
我写了一个多线程程序,调试发现线程函数已经正常返回,但是在主线程join 等待线程结束还是返回timeout,不知道啥缘故
...全文
269 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
victor_cui 2010-05-04
  • 打赏
  • 举报
回复
关键是我的模块是出于最底层,被很多不同的模块调用,用的是显式load,有的是隐式,所以不得已在atexist里面注册了清理函数。感觉这个函数是在process detach里面运行的,这个时候线程状态已经很怪异了, 所以使用waitsingleobject并不能得到函数的退出状态
gg606 2010-04-30
  • 打赏
  • 举报
回复
感觉LZ使用线程的习惯似乎与本人很是不同,而且LZ的代码我也没看太明白,atexit也不知是什么东东。所以不好说什么了。
尹成 2010-04-29
  • 打赏
  • 举报
回复
你用了WatiForSingleObject等一些等待函数吧,如果是那么你线程结束前,设置了等待的东西没哟
candy_huang11 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 victor_cui 的回复:]
原因查明,是因为我再atexist里面停止的线程,如果我在代码中显式的停止线程就不会有这个问题,但是底层的原因还是不明了,并且我的程序因为牵扯到很多模块,所以不得已才在atexit当中调用,所以请问高手有什么办法避免这个问题呢
[/Quote]
你这属于线程间的竞争了,应该处理的是设计的问题
victor_cui 2010-04-29
  • 打赏
  • 举报
回复
原因查明,是因为我再atexist里面停止的线程,如果我在代码中显式的停止线程就不会有这个问题,但是底层的原因还是不明了,并且我的程序因为牵扯到很多模块,所以不得已才在atexit当中调用,所以请问高手有什么办法避免这个问题呢
liwei3290 2010-04-29
  • 打赏
  • 举报
回复
建立个线程退出事件 event
线程WaitForSingleObject(event,0)
如果等到就 break 退出


这样你想退出线程 EetEvent(event)就可以了

mszjk 2010-04-28
  • 打赏
  • 举报
回复
C++啊C++......
red-fly 2010-04-28
  • 打赏
  • 举报
回复
应该是程序有问题,我也有遇到过这种问题,但后来没有真正解决,期待有高人回复
victor_cui 2010-04-28
  • 打赏
  • 举报
回复
高手请进啊
victor_cui 2010-04-26
  • 打赏
  • 举报
回复
我用_beginthreadex 创建 线程,在线程函数返回的地方执行_endthread
victor_cui 2010-04-26
  • 打赏
  • 举报
回复
我有waitforsingleobject 等待线程句柄,返回超时,并且可以确认的是线程函数已经返回
victor_cui 2010-04-26
  • 打赏
  • 举报
回复
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;
}
victor_cui 2010-04-26
  • 打赏
  • 举报
回复
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;
}

创建
gg606 2010-04-26
  • 打赏
  • 举报
回复
不应该呀!贴点代码出来看看
songtao_01 2010-04-24
  • 打赏
  • 举报
回复
超时返回?
你是不是用了WatiForSingleObject等一些等待函数啊,如果是那么你线程结束前,设置了等待的东西没哟(比如用SetEvent设置事件,让WatiForSingleObject返回)
AIHANZI 2010-04-24
  • 打赏
  • 举报
回复
死锁问题。。。
用WatiForSingleObject,再用TermiateThread()干掉它
wb_rock 2010-04-23
  • 打赏
  • 举报
回复
学习ing
ccc_cgreen 2010-04-23
  • 打赏
  • 举报
回复
如果你是afxbegingthread在线程退出之前在线程里面调用一下afxendthread.
tanwei1002 2010-04-23
  • 打赏
  • 举报
回复
有可能死锁
见习学术士 2010-04-23
  • 打赏
  • 举报
回复
检查是不是线程与窗口消息循环死锁了。
加载更多回复(1)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧