linux多线程中(c++)map操作erase的时候产生core!请各位大神帮我解惑!

1:首先erase操作完全符合规范,是find 到迭代器it后,然后调用erase时,导致core了
2:由于需要频繁使用该map,并做erase操作,并不是每个erase会出core,而是有一定概率出现,例如操作了1万次后可能会出现
3:一下是gdb信息
(gdb) where
#0 0x000000347b55c742 in std::_Rb_tree_rebalance_for_erase () from /usr/lib64/libstdc++.so.6
#1 0x0000002a958ba076 in CSendThread::OnSubmitRespProc () from ../lib/libClientModule.so
#2 0x0000002a958bc4c2 in CSendThread::OnSocketRead () from ../lib/libClientModule.so
#3 0x0000002a958b7770 in CClientSocket::OnSocketNotifyRead () from ../lib/libClientModule.so
#4 0x0000002a958b7e1d in CClientSocket::RepetitionRun () from ../lib/libClientModule.so
#5 0x0000000000407f14 in CServiceThread::ThreadFunction ()
#6 0x0000003478206137 in start_thread () from /lib64/tls/libpthread.so.0
#7 0x0000003477bc9883 in clone () from /lib64/tls/libc.so.6

这种情况一般是线程未同步引起的。
STL不是线程安全的,如果你在多个线程中同时操作同一个map,你就必须自己进行同步。追问

当然做了同步了啊,正因为做了同步,然后对Map操作也正确,所以才觉得纳闷

追答

_Rb_tree_rebalance_for_erase就是将节点从红黑树中移除并调整平衡,这个函数很复杂,我也不懂,但是肯定不会错,仅仅从你上面的信息根本没办法看出错误,还是好好查查自己的程序吧。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-11
不给代码让别人怎么帮你分析错误啊。既然出错了显然是你STL没有正确使用的结果,你又不给代码,你这些gdb信息只能粗略判断错在什么位置,根本不能判断是什么错误。
第2个回答  2012-12-25
额...我也遇到了这个问题,要是有答案一定要回答一下我...

linux多线程中(c++)map操作erase的时候产生core!请各位大神帮我...
这种情况一般是线程未同步引起的。STL不是线程安全的,如果你在多个线程中同时操作同一个map,你就必须自己进行同步。

c++ STL map 中erase()后++会指向那个元素?以及erase后map将会自动做什...
map的erase()有三个重载函数,你说的是哪个? 如果是根据key值来删除,成功返回1,失败返回0.如果根据迭代器删除单个,迭代器要后++,因为删除了的迭代器会失效,所以要指向下一个。如果是根据迭代器删除一片的话,要重新指定迭代器。

相似回答