c++ stl map 的问题!

xengine-qyt 2013-08-07 10:39:23
莫名其妙,搞不动啊,为什么客户端崩溃后在链接我我会挂掉?只要正常离开就没问题,刚开始我还以为是客户端离开后因为我收不到离开消息而导致重复KEY挂掉。。后来测试不是,怎么处理?
挂在STL INSERT 插入数据的时候,STL 挂了真不知道怎么调试。。太恼火了

链接代码:



NetCore_IsErrorOccur = FALSE;

struct sockaddr_in st_ClientAddr;
socklen_t nLenAddr = sizeof(st_ClientAddr);
NETCORE_TCPEPOLL_CLIENT st_EPollClient;
TCHAR tszClientAddr[64];

memset(tszClientAddr,'\0',64);
memset(&st_ClientAddr,'\0',sizeof(st_ClientAddr));
memset(&st_EPollClient,'\0',sizeof(st_EPollClient));

SOCKET m_AccpetSocket = accept(hSocket,(struct sockaddr *)&st_ClientAddr,&nLenAddr);

if (SOCKET_ERROR == m_AccpetSocket)
{
NetCore_IsErrorOccur = TRUE;
NetCore_dwErrorCode = ERROR_NETENGINE_NETCORE_TCP_EPOLL_ACCEPT_ISFAILED;
return FALSE;
}

if (!m_NetSocket.NetCore_Socket_SetNoneBlock(m_AccpetSocket))
{
return FALSE;
}

m_NetSocket.NetCore_Socket_KeepAlive(m_AccpetSocket);

struct epoll_event st_ePollSocket;
memset(&st_ePollSocket,'\0',sizeof(st_ePollSocket));

if (bIsCtrl)
{
st_ePollSocket.events = EPOLLIN | EPOLLOUT | EPOLLET;
}
else
{
st_ePollSocket.events = EPOLLIN | EPOLLOUT | EPOLLET | EPOLLRDHUP | EPOLLERR;
}
st_ePollSocket.data.fd = m_AccpetSocket;
if (bIsCtrl)
{
if (-1 == epoll_ctl(m_CtrlEPoll,EPOLL_CTL_ADD,m_AccpetSocket,&st_ePollSocket))
{
close(m_AccpetSocket);
NetCore_IsErrorOccur = TRUE;
NetCore_dwErrorCode = ERROR_NETENGINE_NETCORE_TCP_EPOLL_ACCEPT_ADDCTL;
return FALSE;
}
}
else
{
if (-1 == epoll_ctl(m_DataEPoll,EPOLL_CTL_ADD,m_AccpetSocket,&st_ePollSocket))
{
close(m_AccpetSocket);
NetCore_IsErrorOccur = TRUE;
NetCore_dwErrorCode = ERROR_NETENGINE_NETCORE_TCP_EPOLL_ACCEPT_ADDCTL;
return FALSE;
}
}
pthread_mutex_init(&st_EPollClient.st_csWrite,NULL);
pthread_mutex_lock(&st_EPollClient.st_csWrite);

st_EPollClient.m_Socket = m_AccpetSocket;
st_EPollClient.bIsCtrl = bIsCtrl;
st_EPollClient.lParam = this;

_stnprintf_s(tszClientAddr,sizeof(tszClientAddr),_T("%s:%d"),inet_ntoa(st_ClientAddr.sin_addr),ntohs(st_ClientAddr.sin_port));
stl_MapClient.insert(make_pair(tszClientAddr,st_EPollClient)); //死在这里

list<NETCORE_TCPEPOLL_SENDMSG> stl_ListSendMsg;
stl_MapSendMsg.insert(make_pair(st_EPollClient.m_Socket,stl_ListSendMsg));

map<tstring,NETCORE_TCPEPOLL_CLIENT>::iterator stl_MapIterator = stl_MapClient.find(tszClientAddr);
pthread_mutex_unlock(&stl_MapIterator->second.st_csWrite);
lpCall_ePoll_Login(tszClientAddr,bIsCtrl,m_lPLogin);
return TRUE;


堆栈:


#0 0x0629f8c6 in std::_Rb_tree_insert_and_rebalance () from /usr/lib/libstdc++.so.6
(gdb) bt
#0 0x0629f8c6 in std::_Rb_tree_insert_and_rebalance () from /usr/lib/libstdc++.so.6
#1 0x0068a8d8 in std::_Rb_tree<std::string, std::pair<std::string const, tag_NetCore_TCPEPoll_Client>, std::_Select1st<std::pair<std::string const, tag_NetCore_TCPEPoll_Client> >, std::less<std::string>, std::allocator<std::pair<std::string const, tag_NetCore_TCPEPoll_Client> > >::_M_insert (this=0x68d690, __x=0x0, __p=0x997a580,
__v=@0xab1af198) at /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:821
#2 0x0068aaa8 in std::_Rb_tree<std::string, std::pair<std::string const, tag_NetCore_TCPEPoll_Client>, std::_Select1st<std::pair<std::string const, tag_NetCore_TCPEPoll_Client> >, std::less<std::string>, std::allocator<std::pair<std::string const, tag_NetCore_TCPEPoll_Client> > >::insert_unique (this=0x68d690, __v=@0xab1af198)
at /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:931
#3 0x0068ab1c in std::map<std::string, tag_NetCore_TCPEPoll_Client, std::less<std::string>, std::allocator<std::pair<std::string const, tag_NetCore_TCPEPoll_Client> > >::insert (this=0x68d690, __x=@0xab1af198) at /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:396
#4 0x00686d81 in CNetCore_TCPEPoll::NetCore_TCPEPoll_AcceptClient (this=0x68d620, hSocket=16, bIsCtrl=false) at ./NetCore_ePoll/Socket_ePoll.cpp:614
#5 0x006874f4 in CNetCore_TCPEPoll::NetCore_Thread_DataAccept (lParam=0x68d620) at ./NetCore_ePoll/Socket_ePoll.cpp:922
#6 0x00b165ab in start_thread () from /lib/libpthread.so.0
#7 0x00a7bcfe in clone () from /lib/libc.so.6

...全文
113 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2013-08-07
  • 打赏
  • 举报
回复
红黑树的插入可不只是影响这个节点本身。因此只锁自己节点是不够的。
FancyMouse 2013-08-07
  • 打赏
  • 举报
回复
目测是因为只锁了map的单个节点而不是锁整棵树,导致多线程同时修改树,然后挂了。
xengine-qyt 2013-08-07
  • 打赏
  • 举报
回复
啊,我好像找到问题了,我在释放这个STL的地方强制卸载了锁! 可能会引起问题。在测试下!

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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