纠结了很久的问题。多线程和stl容器。

我是菜鸟999 2016-09-22 09:26:20
先介绍一下流程:
1、初始化map,填充数据:map<string,vector<s_time_slice>> m_map_ts;//s_time_slice是简单结构
2、数据来了,首先通过m_map_ts判断数据是否是正确的,如果正确则加锁塞入缓存

if (data_check(sdd_copy))// 用到了m_map_ts(只读)!!
{
m_al_sdd.Lock(); // 互斥锁
m_vec_sdd_buf.push_back(sdd_copy);//vector缓存
m_al_sdd.UnLock();
}

3、处理线程不停的从m_vec_sdd_buf取数据,并且有很多处理。也用到了m_map_ts(只读),还用到了map<int,map<string,s_kline>> m_mapContainer;
m_mapContainer存放处理完的数据。
m_mapContainer是处理线程读写的,别的地方没有任何操作。

问题就是,我处理大量的数据时,一开始都是稳定运行的,但是大概10分钟之后,整个程序都慢下来了。加入日志,发现时间消耗在map的find上。我很奇怪,m_map_ts都是只读,没有加锁。而m_mapContainer只有处理线程一个操作他,也没有加锁。为什么还突然变慢了呢?
而且同样的程序,我本机是i3+8G内存会卡。但是放到服务器e5+32G内存就一点事没有。
如果有大神有空,我给下源码,帮着看一下。
...全文
283 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqiang01234 2016-09-22
  • 打赏
  • 举报
回复
m_mapContainer中的数据量有多大?把定义从map<int,map<string,s_kline>>改为map<pair<int, string>, s_kline>试试。 双重map,查找起来肯定费劲
赵4老师 2016-09-22
  • 打赏
  • 举报
回复
《Windows核心编程》
赵4老师 2016-09-22
  • 打赏
  • 举报
回复
如果你加了你认为可能多余加的锁后,长时间运行不出现错误;而一旦去掉加锁,就出错误。 那么99.999%的概率你要加锁。
cocoabird 2016-09-22
  • 打赏
  • 举报
回复
时间消耗在map的find上,是不是map内容一直在增加呢?
paschen 版主 2016-09-22
  • 打赏
  • 举报
回复
具体原因不知,那你试下用unordered map吧,查找速度比map快
我是菜鸟999 2016-09-22
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
多个线程同时写呢?
没有多线程写。只有多线程读m_map_ts,单线程读写m_mapContainer,两个map都没有加锁。
赵4老师 2016-09-22
  • 打赏
  • 举报
回复
多个线程同时写呢?
我是菜鸟999 2016-09-22
  • 打赏
  • 举报
回复
引用 1 楼 chendongk 的回复:
没有解锁码?
vector缓存加了锁,map都没有用锁,因为没有出现一个线程写,另一个线程读的情况。
leowilliam 2016-09-22
  • 打赏
  • 举报
回复
没有解锁码?
我是菜鸟999 2016-09-22
  • 打赏
  • 举报
回复
引用 9 楼 jiqiang01234 的回复:
m_mapContainer中的数据量有多大?把定义从map<int,map<string,s_kline>>改为map<pair<int, string>, s_kline>试试。 双重map,查找起来肯定费劲
改过来了,持续跑的时间长了一点点,但是最终还是慢下来了。。。

64,646

社区成员

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

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