void CClientSocket::OnClose(intnErrorCode)
{
if(m_parentdlg!=NULL)
m_parentdlg->ProcessClose(this);
CSocket::OnClose(nErrorCode);
}
然后在m_parentdlg(CMsgTraDlg)的ProcessClose 中锁住列表,删除该socket 但失败
void CMsgTraDlg::ProcessClose(CClientSocket *pSocket)
{
m_mutex.Lock();//锁不住 m_mutex全局的变量
...........
查询列表,删除pSocket
m_mutex.Unlock();
}
如果两个SOCKET 连接到服务端后,先后掉线,当第一个执行ProcessClose 还没有运行到m_mutex.Unlock(); 时,第二个,也可以进入查询列表,删除pSocket ,他没有在m_mutex.Lock();锁住