|
楼主 |
发表于 2007-12-31 22:24:21
|
显示全部楼层
线程同步有典型的错误
void CClientService::SetWorkFinish()
{
m_CmdWork.msg_queue()->deactivate();
m_CmdWork.m_Exit = 0; //必须加保护,如InterlockedExchange操作等等
m_CmdWork.flush();
m_CmdWork.wait();
}
int CmdWork::svc(void)
{
while(done())
{
ACE_Message_Block *mb = 0;
if(this->getq(mb) == -1)
{
CClientService* ConPtr = ACE_static_cast(CClientService*, m_ConServerThis_);
if(ConPtr->m_ConFlag == 0 || ConPtr->m_ConFlag == 10){
//退出数据服务端的事件循环
this->SetDone();
}
ACE_DEBUG((LM_DEBUG, ACE_TEXT("%ITime[%D]>>>>>>>>>>>this[%d]msg_queue[%d].\n"),this, this->msg_queue()));
return 0;
}
//处理消息
Proccess_Task(mb);
}
return 0;
}
int CmdWork::done()
{
return m_Exit; //错误!没有线程同步保护
}
我还没有运行你的代码,只是从上面来看,就存在这个问题。这个问题将导致不确定的线程错误 - 线程可能不能正确退出,导致程序问题。你修改一下,应该可以解决了。 |
|