c++多线程操作list,出现偶发异常

qq_22229525 2019-03-15 03:54:14
c++多线程操作list,在该list.size()=0后,执行list.resize(0);出错了,该异常偶发,大多情况都运行正常……
...全文
453 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yshuise 2019-07-01
  • 打赏
  • 举报
回复
你设计的get都有问题,是不能把引用传出,这回破坏加锁
636f6c696e 2019-07-01
  • 打赏
  • 举报
回复
STL都是非线程安全的,所有访问处都需要加锁,而不只是出错的地方
赵4老师 2019-07-01
  • 打赏
  • 举报
回复
多线程需要加锁。
qq_22229525 2019-06-29
  • 打赏
  • 举报
回复
是用了map,我现在另一个程序也出现了类似的问题,map的second是list,然后map的迭代器取出来值是对的,但是接着用list的迭代器取就是错的,然后程序就挂了…
一见 2019-04-02
  • 打赏
  • 举报
回复
引用 5 楼 一见 的回复:
好象不是出在list,用了map?
确实,看调用栈是嵌套的:std::map<std::string, std::pair<std::string, std::list<CEventINfo> > >
一见 2019-03-18
  • 打赏
  • 举报
回复
好象不是出在list,用了map?
老葱1# 2019-03-16
  • 打赏
  • 举报
回复
虽然不知 size() == 0, 调用 resize(0) 有啥意义, 但不应该出错。 只能怀疑是有其他线程没有加锁保护的情况下写入list。
sdghchj 2019-03-15
  • 打赏
  • 举报
回复
T是怎么定义的?
qq_22229525 2019-03-15
  • 打赏
  • 举报
回复
有加锁,代码如下

bool get(T &x)
{
m_lock.Lock();
if (m_listCache.size() == 0)
{
m_listCache.resize(0);
m_lock.UnLock();
return false;
}
else
{
x = m_listCache.back();
m_listCache.pop_back();
m_lock.UnLock();
return true;
}
}

core打印的栈如下:
#0 0x000000000063a7d7 in std::_List_const_iterator<CEventInfo>::operator== (
this=0x7f184ac05978, __x=...)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:252
#1 0x000000000063b991 in std::distance<std::_List_const_iterator<CEventInfo> > (__first=
Traceback (most recent call last):
File "/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py", line 108, in to_string
return self.val['_M_node'].cast(nodetype).dereference()['_M_data']
RuntimeError: Cannot access memory at address 0x7463616e49707041
, __last=...)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_funcs.h:118
#2 0x000000000063b9db in std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::list<CEventInfo, std::allocator<CEventInfo> > >, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::list<CEventInfo, std::allocator<CEventInfo> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::list<CEventInfo, std::allocator<CEventInfo> > > > >::_M_end (this=0x64872e)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:476
#3 0x000000000063ba0b in std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::list<CEventInfo, std::allocator<CEventInfo> > >, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::list<CEventInfo, std::allocator<CEventInfo> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::list<CEventInfo, std::allocator<CEventInfo> > > > >::_M_root (this=0xb08a)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:442
#4 0x000000000064a6c4 in TemplateMutexCatch<CEventInfo>::get (this=0x10c2498, x=...)
at ../../source/monbasic/./MonTools.h:995
smwhotjay 2019-03-15
  • 打赏
  • 举报
回复

多线程操作list 记得用临界锁。

64,649

社区成员

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

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